我有一个通用的方法:
Func<IEnumerable<T>, bool> CreateFunction<T>()
Run Code Online (Sandbox Code Playgroud)
哪里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>>();
Run Code Online (Sandbox Code Playgroud)
等等
根据@Andy的答案澄清
最终我想知道是否T从/ implements继承,IDictionary即使它T本身是Dictionary或从该接口派生的其他类型.
if(typeof(T) == typeof(IDictionary<,>)
Run Code Online (Sandbox Code Playgroud)
不起作用,因为T泛型类型不是泛型类型定义.
并且在不知道TKey和TValue(在编译时不知道)的情况下,我不能对运行时我知道的任何具体类型进行比较.
我唯一想到的就是查看类型的名称或者用反射检查它的方法,寻找能让我相信它是字典的方法(即寻找ContainsKey和get_Item).
有没有直接的方法来做出这种决定?