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

本文关键字:泛型类型 实现 泛型接口 任何 对象 是否 测试 | 更新日期: 2023-09-27 18:36:16

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

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

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

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

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

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

像这样的东西怎么样

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

我相信您可以轻松地对任何泛型类型定义进行概括。