2012-06-05 44 views
6

我想测试一个对象以查看它是否实现IDictionary<TKey,TValue>但我不在乎TKeyTValue是什么。测试某个对象是否为任何通用类型实现了通用接口

我可以测试是否是框架Dictionary<,>的这样一个具体的实例:

bool isDict = type.IsGenericType && 
    (typeof(Dictionary<,>).IsAssignableFrom(type.GetGenericTypeDefinition()); 

,但我不能想办法来测试的东西,实现IDictionary<,>。这种技术对接口不起作用; IsAssignableFrom如果我针对通用基类型IDictionary<,>进行测试,则返回false,这看起来很奇怪,因为它适用于具体类型。

通常你会使用is测试某实现了一个接口,当然如果我想测试一个特定的通用接口,这仅适用。或者,我只想测试一个共同的祖先接口,但不像其他通用数据结构,如IList<>ICollection<>,没有独特的非一般的接口,一般IDictionary<TKey,TValue>继承。

回答

10

如何像

return type.GetInterfaces() 
      .Where(t => t.IsGenericType) 
      .Select(t => t.GetGenericTypeDefinition()) 
      .Any(t => t.Equals(typeof(IDictionary<,>))); 

,我敢肯定,你可以很容易地概括为任何泛型类型定义。

+1

像。我如何忽视GetInterfaces? –

相关问题