Tag: 约束

为什么MassTransit消息中不允许使用结构?

MassTransit的使用者接口都希望消息模型是类而不是结构。 因为它们都是内部接口(我必须说非常好的设计),这是显示约束的通用容器类,直接取自源代码 : /// /// Declares a Consume method for the message type TMessage which is called /// whenever aa message is received of the specified type. /// public static class Consumes where TMessage : class 对于刚开始使用该技术的人来说,这不是一个问题,但这对我们来说很麻烦,因为在我们的代码库中已经有了与命令模式相关的对象,甚至在考虑使用服务总线框架之前,所以我们不得不改变了很多接口和generics类来为它们添加这个约束来与MT一起工作。 我们很幸运没有明确地拥有任何struct类型,因为这可能会导致更多(可能是不需要的)更改。 为什么它要求消息类成为一个class ? 是否可以更改它,以便库与现有代码更加无缝地连接? 我认为虽然没有添加约束,所以可能存在一些并发症。

具有generics类声明的命名空间约束

我想知道是否(如果是这样的话)可以将命名空间定义为generics类声明中的约束参数。 我有的是这个: namespace MyProject.Models.Entities < – 包含要在db中保留的类 namespace MyProject.Tests.BaseTest < – 我觉得很明显 现在我的’BaseTest’课程的变化看起来像这样; public class BaseTest 此BaseTest (在编写本文时)执行的操作比删除测试期间添加到数据库的所有实体要多得多。 所以通常我会将测试类声明为: public class MyEntityRepositoryTest : BaseTest 我想要做的是类似于以下内容: public class BaseTest where T : 现在我知道完全可以简单地声明一个’BaseEntity’类, MyProject.Models.Entities命名空间中创建的所有实体都将从该类inheritance; public class BaseTest where T : MyBaseEntity 但是……我实际上并不需要或想要。 另外,我使用ORM和带有inheritance的映射实体,虽然可能,但增加了一层不需要的复杂性。 那么,是否可以将generics类参数约束到命名空间而不是特定类型?

带有可选参数的构造函数违反new()约束

我有一个这个构造函数的类: public Currency(Guid? vcurrencyUI = null) : base(vcurrencyUI) { } 我想使用new()约束这个类,但我收到此错误: ‘Currency’必须是具有公共无参数构造函数的非抽象类型,才能在generics类型或方法中将其用作参数’T’… 如果我拆分构造函数一切正常: public Currency(Guid? vcurrencyUI) : base(vcurrencyUI) { } public Currency() : base() { } 为什么我需要拆分构造函数?

在C#中强制通用接口实现

无论如何强制通用定义的约束来实现“通用接口”……也就是说,我希望类支持传递接口和限制它的generics类,以便类实现接口。 例如,如果我说: MyGenericClass.DoSomething(); 这应该受到限制,以便MyImplementation实现IMyInterface 据我所知,可以通过实现 public class Dynamic_Loader where S: T 现在,无论如何也迫使T成为一个界面? 编辑:这样做的目的是: private static List interfaceList = new List(); public static List InterfaceList {get { return interfaceList;}} public static void Add(S input) { interfaceList.Add(input);} 并且列表仅限于接口(因为它应该返回某些接口的实现)

编译器无法转换受约束的generics类型

我有一个通用类型为“G”的类 在我的class级模型中我有 public class DetailElement : ElementDefinition 假设我有这样的方法 public void DoSomething(G generic) where G : ElementDefinition { if (generic is DetailElement) { ((DetailElement)generic).DescEN = “Hello people”; //line 1 ////// ElementDefinition element = generic; ((DetailElement)element).DescEN = “Hello again”; //line 3 ////// (generic as DetailElement).DescEN = “Howdy”; //line 5 } else { //do other stuff } } […]

ADO.NET CommandBuilder,InsertCommand和Default Constraints

我正在将数据从表A复制到表B.表B有一个可为空的列,其默认约束值为0.通常,我使用以下访问器设置列的值。 public object this[string columnName] { get { return DataTable.Rows[CurrentRow][columnName]; } set { DataTable.Rows[CurrentRow][columnName] = value; } } 但我没有设置我的可空列X. 插入整行时,不使用默认值。 而不是0,为可空列插入了NULL。 _sqlCommandBuilder = new SqlCommandBuilder(_sqlDataAdapter); _sqlCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges; _sqlCommandBuilder.SetAllValues = false; _sqlDataAdapter.Update(DataTable); 我也得到了架构: _sqlDataAdapter.Fill(DataTable); _sqlDataAdapter.FillSchema(_dataTable, SchemaType.Mapped); 为什么我的列X的ADO.NET设置为NULL虽然我没有设置它? 我认为当我没有设置列X的值时,ADO.NET从给定的约束中获取默认值。 ADO.NET CommandBuilder是否能够使用默认约束?

使用genericsC#重载:错误还是function?

我们有一个以下简化示例: void Foo(IEnumerable collection, params T[] items) { // … } void Foo(C collection, T item) where C : ICollection { // … } void Main() { Foo((IEnumerable)new[] { 1 }, 2); } 编译说: 类型’System.Collections.Generic.IEnumerable’不能在generics类型或方法’UserQuery.Foo(C,T)’中用作类型参数’C’。 没有从’System.Collections.Generic.IEnumerable’到’System.Collections.Generic.ICollection’的隐式引用转换。 如果我将Main更改为: void Main() { Foo((IEnumerable)new[] { 1 }, 2); } 它会工作正常。 为什么编译器没有选择正确的重载?

C#:Enum.IsDefined在组合标志上

我有这个枚举: [Flags] public enum ExportFormat { None = 0, Csv = 1, Tsv = 2, Excel = 4, All = Excel | Csv | Tsv } 我试图在这个(或任何,真的)枚举上做一个包装,它通知变化。 目前它看起来像这样: public class NotifyingEnum : INotifyPropertyChanged where T : struct { private T value; public event PropertyChangedEventHandler PropertyChanged; public NotifyingEnum() { if (!typeof (T).IsEnum) throw new ArgumentException(“Type T […]

为什么直接转换失败但“as”运算符在测试约束generics类型时成功?

“编译一些使用带有类型约束的generics的C#代码时,我遇到了一个有趣的好奇心。 我写了一个快速测试用例来说明。 我在Visual Studio 2010中使用.NET 4.0。 namespace TestCast { public class Fruit { } public class Apple : Fruit { } public static class Test { public static void TestFruit(FruitType fruit) where FruitType : Fruit { if (fruit is Apple) { Apple apple = (Apple)fruit; } } } } 对Apple的强制转换失败并显示错误:“无法将类型’FruitType’转换为’TestCast.Apple’”。 但是,如果我更改行以使用as运算符,它将编译而不会出现错误: Apple apple = fruit […]

“哪里T:somevalue”是什么意思?

where T : somevalue意味着什么? 我刚看到一些代码说where T : Attribute 。 我认为这与generics有关,但我不确定这意味着什么或它在做什么。 有人知道吗?