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


    在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>的逻辑
    }
  • 相关阅读:
    JavaWeb — 系统结构分析
    ES6新特性:变量的解构赋值
    智能终端信息安全概念(十):内核安全(2)SElinux
    node插件MongoDB(二)——MongoDB的基本命令
    如何修改input的placeholder默认颜色
    构建、标记和发布镜像
    Spring Boot 的启动原理、Spring Boot 自动配置原理
    自动控制原理7.7---离散系统的数字校正
    C中结构体释放问题
    RS-485 通讯协议简介
  • 原文地址:https://www.cnblogs.com/j4587698/p/16142274.html