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

Jam*_*rgy 6 c# generics reflection interface

我想测试一个对象,以确定它实现了IDictionary<TKey,TValue>,但我不在乎什么TKeyTValue有.

我可以测试是否是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)

我相信你可以很容易地推广任何泛型类型定义.