测试对象是否为任何泛型类型实现泛型接口
本文关键字:泛型类型 实现 泛型接口 任何 对象 是否 测试 | 更新日期: 2023-09-27 18:36:16
我想测试一个对象,看看它是否实现了IDictionary<TKey,TValue>
但我不在乎TKey
和TValue
是什么。
我可以测试框架的具体实例是否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<,>)));
我相信您可以轻松地对任何泛型类型定义进行概括。