Tag: generics

检查给定对象(引用或值类型)是否等于其默认值

我正试图找到一种方法来检查并查看给定对象的值是否等于其默认值。 我环顾四周想出来: public static bool IsNullOrDefault(T argument) { if (argument is ValueType || argument != null) { return object.Equals(argument, default(T)); } return true; } 我遇到的问题是我想这样称呼它: object o = 0; bool b = Utility.Utility.IsNullOrDefault(o); 是o是一个对象,但我想让它弄清楚基类型并检查它的默认值。 在这种情况下,基类型是一个整数,我想在这种情况下知道该值是否等于default(int),而不是default(object)。 我开始认为这可能是不可能的。

无法实现接口成员,因为它没有匹配的返回类型List

我有接口IChild和IParent 。 IParent的成员是List 。 我希望有一些实现IParent类,其中每个类都有一个实现IChild的成员: public interface IChild { } public interface IParent { List a { get; set; } } public class ChildA : IChild { } public class ChildB : IChild { } public class ParentA : IParent { public List a { get; set; } } public class ParentB : IParent { […]

绑定匿名类型以创建BindingList

我试图从LINQ查询返回的匿名类型创建BindingList 但BindingList 不接受匿名类型,以下是我的代码 var data = context.RechargeLogs.Where(t => t.Time >= DateTime.Today). Select(t => new { col1 = t.Id, col2 = t.Compnay, col3 = t.SubscriptionNo, col4 = t.Amount, col5 = t.Time }); var tmp = new BindingList(data); 在最后一行generics参数放置什么???

如何实现通用的GetById(),其中Id可以是各种类型

我正在尝试实现一个通用的GetById(T id)方法,该方法将满足可能具有不同ID类型的类型。 在我的示例中,我有一个实体,其ID类型为int ,类型为string 。 但是,我一直收到错误,我不明白为什么: 类型’int’必须是引用类型才能在方法IEntity的generics类型中将其用作参数’TId’ 实体接口: 为了满足我的域模型,可以使用类型为int或string Id。 public interface IEntity where TId : class { TId Id { get; set; } } 实体实施: public class EntityOne : IEntity { public int Id { get; set; } // Other model properties… } public class EntityTwo : IEntity { public string Id { get; […]

C#中的通用与非通用性能

我写了两个等价的方法: static bool F(T a, T b) where T : class { return a == b; } static bool F2(A a, A b) { return a == b; } 时间差异: 00:00:00.0380022 00:00:00.0170009 测试代码: var a = new A(); for (int i = 0; i < 100000000; i++) F(a, a); Console.WriteLine(DateTime.Now – dt); dt = DateTime.Now; […]

为什么C#不支持变体generics类?

拿这个小LINQPad示例: void Main() { Foo foo = new Foo(); Console.WriteLine(foo.Get()); } class Foo { public T Get() { return default(T); } } 它无法使用此错误进行编译: 方差修饰符无效。 只能将接口和委托类型参数指定为变量。 我没有看到代码的任何逻辑问题。 一切都可以静态validation。 为什么不允许这样做? 它是否会导致语言不一致,或者由于CLR的限制而被认为实施起来太昂贵了? 如果是后者,我作为开发人员应该知道什么是上述限制? 考虑到接口支持它,我希望从逻辑上遵循它的类支持。

C#lambda表达式作为函数参数

我最近一直在忙着研究lambda表达式,并且我有一些特定的function,我一直想学习,但似乎无法做出正面或反面。 假设我的代码中有以下逻辑: List foo; // assuming this is populated string[] bar = foo.Select(x => x.StringProperty).ToArray(); 现在,我想将整个操作抽象为一个处理程序方法,以便我可以这样做: string[] bar = MakeArray(foo, x => x.StringProperty); int[] foobar = MakeArray(foo, x => x.IntegerProperty); 我将如何编写该方法的主体? 我预见签名就像: U[] MakeArray( /* some lambda magic? */ ) where T : IEntity {} 但我不知道如何指定我期望lambda表达式作为方法参数,以及它如何准确转换为方法体。 任何人都可以告诉我如何创建上面的MakeArray()函数? 我很确定,一旦我看到它是如何完成的,我就可以从那里拿起它。 编辑 正如评论中指出的那样, MakeArray()需要对IEnumerable的引用。 更新以反映这一点。

如何在C#中减去两个通用对象(T-T)(例如:DateTime – DateTime)?

我写了一个通用类 : public class Interval where T : IComparable // for checking that Start < End { public T Start { get; set; } public T End { get; set; } … } 我将这个类与DateTime,int等一起使用。 我需要一个Duration属性,返回一个持续时间,如: public object Duration { get { return End – Start; } } 但是当我的类中包含此属性时,编译器会在-运算符上引发逻辑错误 。 我能做些什么来正常实现这个目标,还是应该忽略它?

检查类型是否实现通用接口而不考虑generics类型参数

我有一个界面 public interface MyInterface { } 实现是无关紧要的。 现在我想检查给定类型是否是该接口的实现。 这种方法失败了 public class MyClass : MyInterface { } 但我不知道怎么做检查。 public void CheckIfTypeImplementsInterface(Type type) { var result1 = typeof(MyInterface).IsAssignableFrom(type); –> false var result2 = typeof(MyInterface).IsAssignableFrom(type); –> true } 我需要做些什么才能使result1成为现实?

从字符串属性名称创建通用表达式

我有一个名为sortColumn的变量,它包含我想要对查询结果进行排序的列的文本。 我还有一个通用存储库,它将包含我想要排序的字段的Expression作为参数。 我似乎无法从字符串属性名称获取到表达式。 所以我拥有的通用存储库包含以下方法 public IEnumerable Get(Expression<Func> criteria, Expression<Func> orderBy, int pageIndex, int pageSize, bool isAssendingOrder = true, EnumDeletePolicy deletePolicy = EnumDeletePolicy.ExcludeDeleted) 注意这个Get的第二个参数是Expression-Func-TEntity,TOrderBy。 正如我所提到的,我有一个名为sortColumn的变量,它包含我的TEntity对象上的属性的字符串,我需要将此字符串转换为可以传递给Get方法的Expression。 这就是我现在所拥有的。 var parameter = Expression.Parameter(typeof(IContract)); var memberExpression = Expression.Property(parameter, data.SortColumn); var lambdaExpression = Expression.Lambda(memberExpression, parameter); 这将创建LambdaExpression类型的对象。 此LambdaExpression的实际类型是Expression-Func-IContract,字符串(或属性的sortColumn类型)。 如果我调用Get方法并传入此LambdaExpression并将其显​​式转换为Expression类型,那么它将正常工作。 问题是我不知道Expression类型是什么,它可能是一个字符串,int,int?等等。这完全取决于sortColumn属性中特定属性的类型。 你能帮助我最后跳到正确的Expression类型吗? 根据Marc的建议编辑:我几乎有这个工作,实际上基于它正在工作的问题,但我有1个剩余的问题。 作为我要查询的实体类型的IContract实际上是从IRelationshipinheritance的。 如果我从IContract接口指定一个字段,那么上面的代码可以工作。 如果我从IRelationship接口指定一个字段,则以下行失败。 var memberExpression = Expression.Property(parameter, data.SortColumn); 如果我尝试下面这样的东西,以便从IRelationship中获取MemberExpression,但是基于IContract构建Lambda,我会从存储库中收到错误。 var […]