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

 jx   2022-04-13 13:21:49   2279 人阅读  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]。很明显这两个类型是不相等的。所以上面返回flase也就是正常现象了。


那么如何解决这个问题呢?

最简单的办法肯定是typeof(b).baseType == typeof(a<string>)这样就可以返回true。

但是由于我们用了T,所以大概率我们是不知道进来的类型的,所以这种方法不行。

另一种方法麻烦一点。

首先,我们把泛型类型转换成泛型原型,然后再去比较泛型原型就可以了。

c#中提供了获取泛型原型的方法GetGenericTypeDefinition(),MSDN解释如下:

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

所以我们直接使用typeof(b).baseType.GetGenericTypeDefinition()既可获取a<>

这里需要注意的是GetGenericTypeDefinition()在b不是泛型时会抛出异常,所以我们在使用前应该判断b是否是一个泛型类。

c#中同样提供了这个方法IsGenericType,MSDN解释如下:

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

所以我们判断一个类是否继承于泛型基类的方法就是这样的:

if (typeof(b).baseType.IsGenericType && typeof(b).baseType.GetGenericTypeDefinition() == typeof(a)){ 
// 这里是b继承于a<T>的逻辑
}
本文地址:http://www.jvxiang.com/Post?id=6
版权声明:本文为原创文章,版权归 jx 所有,欢迎分享本文,转载请保留出处!

 发表评论

{if $option['ZC_COMMENT_VERIFY_ENABLE']}

{/if}


表情

还没有留言,还不快点抢沙发?