6

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

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

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

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

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

4

1 回答 1

10

像这样的东西怎么样

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

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

于 2012-06-05T15:19:23.753 回答