c#中判断类是否继承于泛型基类

 jvxiang   2019-10-21 20:39   988 人阅读  0 条评论

c#中,有时候我们会编写类似这样的代码:

public class a<T> { //具体类的实现}public class b : a<string>{}

如果b继承a的类型不确定,这个时候我们是无法通过baseType来直接判断b是否继承于a,如果我们写如下代码:
typeof(b).baseType == typeof(a)

返回的是false。

因为typeof(b).baseType返回的类型是a`1[System.String],而typeof(a<>)返回的是a`1[T]

这个时候两者的type是不相等的。

解决方案有两个,其中之一是最简单的,就是typeof(b).baseType == typeof(a<string>)就可以了,但是这个不在今天的讨论范围内。因为既然要写T,就证明我们的类型不确定,在这里做确定的比较没有意义。

第二个解决方法就是将typeof(b).baseType转换为泛型的原型。c#已经给我们提供了一个这样的方法GetGenericTypeDefinition(),MSDN对这个方法的解释如下:

返回一个表示可用于构造当前泛型类型的泛型类型定义的 Type 对象。

如果我们使用typeof(b).baseType.GetGenericTypeDefinition()则会返回a<T>。

直接比较这两个type就可以了。

GetGenericTypeDefinition()在Type不是一个带有泛型的类的时候会出现异常

所以我们需要在使用GetGenericTypeDefinition()之前需要先判断类型是否是一个泛型类型,这里使用这样一个属性IsGenericType,MSDN对这个属性解释如下:

获取一个值,该值指示当前类型是否是泛型类型。

所以我们只需要判断

if (typeof(b).baseType.IsGenericType && typeof(b).baseType.GetGenericTypeDefinition() == typeof(a)){ // 这里是b继承于a<T>的逻辑}

这里再给出一个从所有程序集中获取实现了指定泛型基类的类的方法
ppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes().Where(y => y.BaseType != null && y.BaseType.IsGenericType && y.BaseType.GetGenericTypeDefinition() == typeof(BaseEntity<,>));

 

本文地址:https://www.jvxiang.com/c中判断类是否继承于泛型基类.html
版权声明:本文为原创文章,版权归 jvxiang 所有,欢迎分享本文,转载请保留出处!
NEXT:已经是最新一篇了

 发表评论


表情