c# - 测试对象是否为任何泛型类型实现了泛型接口(interface)

标签 c# generics reflection interface

我想测试一个对象看它是否实现了IDictionary<TKey,TValue>但我不在乎什么TKeyTValue是。

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

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

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

通常你会使用is测试某物是否实现了一个接口(interface),当然这只有在我想测试一个特定的通用接口(interface)时才有效。或者我只是测试一个通用的祖先接口(interface),但不像其他通用数据结构,如 IList<>ICollection<> , 没有唯一的非通用接口(interface)可以从中生成通用 IDictionary<TKey,TValue>继承。

最佳答案

怎么样

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

我相信您可以轻松地将其概括为任何泛型类型定义。

关于c# - 测试对象是否为任何泛型类型实现了泛型接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10900021/

相关文章:

java - 检查 Java 中通配符泛型对象的类型

swift - 在 Swift 中,你能找到一个模块中遵守特定协议(protocol)的所有类型吗?

c# - 如何将 Dictionary<string,MyClass> 转换为 Dictionary<string,object>

javascript - 启用 使用 Jquery 禁用某些组件

c# - 没有 setter 的 Automapper 嵌套集合

java - 泛型混淆 : deceiving the compiler

Java - 使用带有接口(interface)的哈希表作为值

java - 在Java中的父类(super class)的构造函数中获取扩展泛型类的泛型类型?

c# - 并发控制Oracle与Delphi7

c# - 如何在通过 C# 自动化时禁用 Excel 中的兼容性检查