Tag: generics

MongoDB C#驱动程序类型鉴别器,generics类inheritance自非generics基类

我正在尝试使用官方C#驱动程序存储从mongodb中的非generics基类inheritance的generics类的对象列表。 我的代码如下所示: abstract class MyAbstractClass {} class MyGenericClass: MyAbstractClass { [BsonRequired] public List Values = new List(); public MyGenericClass(IEnumerable values) { Values.AddRange(values); } } class MyContainerClass { [BsonId] public string Id; [BsonRequired] public List ValueCollections = new List(); public MyContainerClass() { Id = Guid.NewGuid().ToString(); } } 在测试时,我创建了一个容器对象并用generics类的实例填充它,如下所示: var container = new MyContainerClass(); container.ValueCollections.Add(new MyGenericClass(new[]{“foo”,”bar”,”baz”})); 当我将其保存到数据库时,添加的文档如下所示: […]

混合generics方法和扩展方法

我在Class1.GetChild() where T : DependencyObject创建了Class1.GetChild() where T : DependencyObject扩展方法。 之后,依赖于lib1.dll的所有程序集都无法编译并出现错误: 类型’System.Windows.DependencyObject’在未引用的可配置中定义。 您必须添加对程序集“WindowsBase”等的引用… 为什么依赖程序集需要WindowsBase即使它们不使用GetChild ? 。 要重现(vs2010 .net4): lib1.dll (引用WindowsBase ) namespace lib1 { public static class Class1 { public static T GetChild(this DependencyObject src) where T : DependencyObject { return default(T); } } public static class Class2 { public static int SomeExtMethod(this string src) { […]

如何通过reflection找到重载方法

这是我之前提出的另一个问题的问题 。 我有一个重载的方法: public void Add(SomeType some) { } public void Add(AnotherType another) { } 如何通过reflection找到每种方法? 例如,如何通过reflection获得Add(SomeType some)方法? 你能帮我吗? 提前致谢。

如何通过使用lambda表达式作为参数进行reflection来调用方法?

我想做这个: MethodInfo m = myList.GetType().GetMethod(“ConvertAll”, System.Reflection.BindingFlags.InvokeMethod).MakeGenericMethod(typeof(object)); List myConvertedList = (List)m.Invoke(myList, new object[]{ (t => (object)t)}); myList是特定类型的通用列表(应用程序未知),我想将其转换为对象列表以执行某些操作。 但是这会失败,并显示以下错误:“无法将lambda表达式转换为’object’类型,因为它不是委托类型” 你能帮我找到什么问题吗? 我想做一些不可能的事吗? 有没有其他方法来实现同样的事情?

将generics类型参数约束为数值类型

我正在定义一个generics类型: public class Point where T : IConvertible, IComparable 我真正想做的是将T限制为数字类型(int或浮点之一。)CLR中没有INumeric。 是否有接口或接口集合可用于将类型约束为其中一个盒装数字类?

函数返回一个generics类型,其值仅在运行时已知

我需要使用如下通用接口: public interface IContainer { IEnumerable<IContent> Contents { get; } } 实现此接口的对象由以下generics方法返回: IContainer GetContainer(IProperty property); 直到运行时,类型T才是未知的。 使用reflection我可以调用GetContainer方法并获得结果。 我的问题是我不知道如何枚举具有Object类型的结果(因此我无法将其IEnumerable为IEnumerable )。 我也试过如下铸造,但它不起作用(它说“预期类型”): var myContainer = genericMethodInfo.Invoke( myService, new object[] { property }) as typeof(IContainer).MakeGenericType(type); 其中type是运行时类型, myService是公开GetContainer方法的服务, property是IProperty类型。 更新 :在我的博客中查看我的完整解决方案: http : //stefanoricciardi.com/2010/02/18/generics-with-type-uknown-at-compile-time/

比较两个Dictionary 的最佳方法是否相等

这是为两个字典的平等创建比较器的最佳方法吗? 这需要准确。 请注意,Entity.Columns是KeyValuePair的字典(字符串,对象): public class EntityColumnCompare : IEqualityComparer { public bool Equals(Entity a, Entity b) { var aCol = a.Columns.OrderBy(KeyValuePair => KeyValuePair.Key); var bCol = b.Columns.OrderBy(KeyValuePAir => KeyValuePAir.Key); if (aCol.SequenceEqual(bCol)) return true; else return false; } public int GetHashCode(Entity obj) { return obj.Columns.GetHashCode(); } } 关于GetHashCode实现也不太确定。 谢谢!

重载,generics类型推断和’params’关键字

我刚注意到一个带有重载决策的奇怪行为。 假设我有以下方法: public static void DoSomething(IEnumerable items) { // Whatever // For debugging Console.WriteLine(“DoSomething(IEnumerable items)”); } 现在,我知道这个方法通常会使用少量显式参数调用,所以为方便起见,我添加了这个重载: public static void DoSomething(params T[] items) { // Whatever // For debugging Console.WriteLine(“DoSomething(params T[] items)”); } 现在我尝试调用这些方法: var items = new List { “foo”, “bar” }; DoSomething(items); DoSomething(“foo”, “bar”); 但在这两种情况下,都会调用params的重载。 我希望在List的情况下调用IEnumerable重载,因为它看起来更匹配(至少对我而言)。 这种行为是否正常? 谁能解释一下呢? 我在MSDN文档中找不到任何关于它的明确信息……这里涉及的重载决策规则是什么?

通用方法解决方案

请考虑以下代码: public class Tests { public void Test() { Assert.AreEqual(“Int”, DoSomething(1)); } public static string DoSomething(T value) { return “Generic”; } public static string DoSomething(int value) { return “Int”; } } 正如所料,将调用非genericsDoSomething方法。 现在考虑以下修改: public class Tests { public void Test() { Assert.AreEqual(“Int”, DoSomething(1)); } public static string DoSomething(T value) { return “Generic”; } public static […]

IsAssignableFrom还是AS?

我有下一个代码: private T CreateInstance(object obj) // where T : ISomeInterface, class { … if (!typeof(T).IsAssignableFrom(obj.GetType())) { throw ..; } return (T)obj; } 它可以替换为: T result = obj as T; if (result == null) { throw ..; } return result; 如果不是 – 为什么?