测试对象是否为任何泛型类型实现通用接口

时间:2012-06-05 15:15:44

标签: c# generics reflection interface

我想测试一个对象以查看它是否实现IDictionary<TKey,TValue>但我不关心TKeyTValue是什么。

我可以测试是否是框架Dictionary<,>的具体实例,如下所示:

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

但是我想不出一种方法来测试实现IDictionary<,>的东西。这种技术不适用于界面;如果我针对通用基类型IsAssignableFrom进行测试,IDictionary<,>将返回false,这似乎很奇怪,因为它适用于具体类型。

通常你会使用is来测试某些东西是否实现了一个接口,当然这只有在我想测试一个特定的通用接口时才有用。或者我只测试一个共同的祖先接口,但与IList<>ICollection<>等其他通用数据结构不同,没有通用IDictionary<TKey,TValue>继承的唯一非泛型接口。

1 个答案:

答案 0 :(得分:10)

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

我确信您可以轻松地概括任何泛型类型定义。