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>的逻辑
}
c#中判断类是否继承于泛型基类的更多相关文章
- 【C++】继承(虚基类)
类的继承与派生 面向对象技术强调软件的可重用性,这种重用性通过继承机制来实现.而在类的继承过程中,被重用的原有类称为基类,新创建的类称为派生类.派生类定义语法格式如下: class <派生类名& ...
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
- C++ 多继承与虚基类
转载来自:CSDN insistGoGo (http://blog.csdn.net/insistgogo) 多继承的定义:派生类的基类大于一个 语法: class 派生类名:继承方式1 基类名1 ...
- WPF 之 创建继承自Window 基类的自定义窗口基类
开发项目时,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于 Window 自身的,但窗口的外边框及窗口移动.最小化等标题栏操作基本都是一样的.所以通过查看资料,可按如下方法创建继承 ...
- C++_类继承5-抽象基类
abstract base class,ABC 抽象基类 有时候is-a规则并不像看上去那么简单,例如圆和椭圆的关系.圆是椭圆的特殊情况.椭圆可以派生出圆.但是椭圆的数据成员及方法对于圆来说是信息冗余 ...
- YTU 2622: B 虚拟继承(虚基类)-沙发床(改错题)
2622: B 虚拟继承(虚基类)-沙发床(改错题) 时间限制: 1 Sec 内存限制: 128 MB 提交: 487 解决: 393 题目描述 有一种特殊的床,既能当床(Bed)用又能当沙发(S ...
- 详解C++中基类与派生类的转换以及虚基类
很详细!转载链接 C++基类与派生类的转换在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中 ...
- C++ 虚继承实现原理(虚基类表指针与虚基类表)
虚继承和虚函数是完全无相关的两个概念. 虚继承是解决C++多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝.这将存在两个问题:其一,浪费存储空间:第二,存在二义性问题,通常可 ...
- A:LinkedList实现了List接口; B: AbstractSet实现了Set接口; C: HashSet继承自AbstractSet基类; D: WeakMap继承自 AbstractMap
List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedListSet有两个实现类:HashSet和LinkedHashSetAbstractS ...
随机推荐
- MyEclipse 在浏览器运行里报错,The requested resourse (xx/index.jsp) is not available
在浏览器地址输入新建的web项目(http://localhost:8080/FirstPro/index.jsp),显示请求的资源不可用 这是因为我们新建的项目存放在安装MyEclipse时建立的W ...
- 5月31日 python学习总结 Python中应该使用%还是format来格式化字符串?
%还是format Python中格式化字符串目前有两种阵营:%和format,我们应该选择哪种呢? 自从Python2.6引入了format这个格式化字符串的方法之后,我认为%还是format这根本 ...
- [SPDK/NVMe存储技术分析]005 - DPDK概述
注: 之所以要中英文对照翻译下面的文章,是因为SPDK严重依赖于DPDK的实现. Introduction to DPDK: Architecture and PrinciplesDPDK概论:体系结 ...
- CodeUp Problem D: More is better
根据题目意思,输入的每一对A.B都是直接朋友,并且最后只会得到一个集合,该集合就是Mr Wang选择的男孩. 因此很容易写出代码,甚至不需要自己构建一个并查集,只需要使用C++的set模板,每次读入一 ...
- bzoj4671 异或图(斯特林反演,线性基)
bzoj4671 异或图(斯特林反演,线性基) 祭奠天国的bzoj. 题解时间 首先考虑类似于容斥的东西. 设 $ f_{ i } $ 为至少有 $ i $ 个连通块的方案数, $ g_{ i } $ ...
- BFC优化?
块格式化上下文, 特性: 使 BFC 内部浮动元素不会到处乱跑: 和浮动元素产生边界.
- kafka报文一直打印的问题
一.问题描述 今天开发了一个kafka消费者数据接收的功能,基本过程为分别启动本地的kafka服务和代码程序,在服务端手动发送消息,代码来进行接收消费.经测试,代码功能正常,但是再接收到一条kafka ...
- 四、Springboot+jpa+mycat应用
一.后台配置文件 # 连接地址 url: jdbc:mysql://127.0.0.1:8066/CHUNK?useUnicode=true&characterEncoding=utf-8&a ...
- mybatis-数据库类型的对应关系
- (转载)JSON对象使用变量作为键名
转载链接:https://blog.csdn.net/lihefei_coder/article/details/82499520 //第一种方式 var key = 'name'; var json ...