Jam*_*rgy 6 c# generics reflection interface
我想测试一个对象,以确定它实现了IDictionary<TKey,TValue>,但我不在乎什么TKey和TValue有.
我可以测试是否是Dictionary<,>这样的框架的具体实例:
bool isDict = type.IsGenericType &&
(typeof(Dictionary<,>).IsAssignableFrom(type.GetGenericTypeDefinition());
Run Code Online (Sandbox Code Playgroud)
但我想不出一种方法来测试实现的东西IDictionary<,>.这种技术不适用于界面; IsAssignableFrom如果我测试泛型基类型IDictionary<,>,则返回false ,这看起来很奇怪,因为它适用于具体类型.
通常你会is用来测试某些东西是否实现了一个接口,当然这只有在我想测试一个特定的通用接口时才有用.或者我只是测试一个共同的祖先接口,但与其他通用数据结构(如IList<>和)不同ICollection<>,没有通用IDictionary<TKey,TValue>继承的唯一非泛型接口.
jas*_*son 10
怎么样的
return type.GetInterfaces()
.Where(t => t.IsGenericType)
.Select(t => t.GetGenericTypeDefinition())
.Any(t => t.Equals(typeof(IDictionary<,>)));
Run Code Online (Sandbox Code Playgroud)
我相信你可以很容易地推广任何泛型类型定义.