测试一个对象是否实现了任何一种通用类型的通用接口。

7
我想测试一个对象是否实现了IDictionary<TKey,TValue>,但我不关心TKeyTValue是什么。
我可以像这样测试它是否是框架Dictionary<,>的具体实例:
bool isDict = type.IsGenericType && 
    (typeof(Dictionary<,>).IsAssignableFrom(type.GetGenericTypeDefinition());

但我想不到一种测试实现了IDictionary<,>的方法。这种技术对于接口不起作用;如果我针对泛型基类IDictionary<,>进行测试,则IsAssignableFrom将返回false,这似乎很奇怪,因为它对具体类型有效。

通常您会使用is来测试是否实现了一个接口,但是当然,这仅适用于我想要测试特定的泛型接口的情况。或者我只是测试一个共同祖先接口,但与其他泛型数据结构(如IList<>ICollection<>)不同,没有唯一的非泛型接口从中继承泛型IDictionary<TKey,TValue>

1个回答

10
如何尝试类似以下的内容:
return type.GetInterfaces()
           .Where(t => t.IsGenericType)
           .Select(t => t.GetGenericTypeDefinition())
           .Any(t => t.Equals(typeof(IDictionary<,>)));

我相信您可以轻松地推广到任何通用类型定义。


1
喜欢。我怎么会忽略GetInterfaces呢? - Jamie Treworgy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接