加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 测试对象是否为任何泛型类型实现通用接口

发布时间:2020-12-15 04:13:15 所属栏目:百科 来源:网络整理
导读:我想测试一个对象,看它是否实现了IDictionary TKey,TValue但我不在乎TKey和TValue是什么. 我可以测试是否是框架Dictionary,的具体实例.像这样: bool isDict = type.IsGenericType (typeof(Dictionary,).IsAssignableFrom(type.GetGenericTypeDefinition());
我想测试一个对象,看它是否实现了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<,>)));

我相信你可以很容易地推广任何泛型类型定义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读