【发布时间】:2011-04-15 12:24:49
【问题描述】:
我有一个通用方法:
Func<IEnumerable<T>, bool> CreateFunction<T>()
其中T 可以是任意数量的不同类型。这个方法使用反射做了很多事情,如果T是IDictionary,不管字典的TKey和TValue我需要执行字典特定的代码。
所以可以调用该方法:
var f = CreateFunction<string>();
var f0 = CreateFunction<SomePocoType>();
var f1 = CreateFunction<IDictionary<string,object>>();
var f2 = CreateFunction<Dictionary<string,object>>();
var f3 = CreateFunction<SomeDerivedDictionaryType<string,object>>();
等等
根据@Andy 的回答进行澄清
最终我想知道T 是否继承/实现IDictionary,即使T 本身是Dictionary 或派生自该接口的其他类型。
if(typeof(T) == typeof(IDictionary<,>)
不起作用,因为 T 是泛型类型而不是泛型类型定义。
在不知道 TKey 和 TValue(在编译时不知道)的情况下,我无法与运行时之前知道的任何具体类型进行比较。
我想出的唯一方法是查看类型的名称或使用反射检查其方法,寻找能让我相信它是字典的方法(即寻找 ContainsKey 和 get_Item )。
有没有直接的方法来做出这种决定?
【问题讨论】:
-
为什么要将 T 的类型确定为特定的类,而不是为每个类使用重载?
-
允许的类型集在编译时是未知的。有问题的方法会生成一个 Linq 表达式,该表达式最终要么查询对象的属性,要么在字典的情况下查询集合的内容。
-
这是用于回答stackoverflow.com/questions/74616/…等问题的技术的一小部分。
标签: c# generics reflection types