c#中判断类是否继承于泛型基类
2024-10-19 11:46:02
在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>的逻辑
}
最新文章
- Java工作环境笔记
- c# 连接Mysql数据库
- [bigdata] 使用Flume hdfs sink, hdfs文件未关闭的问题
- C# WinForm TextBox添加水印效果
- How to open MS word document from the SharePoint 2010 using Microsoft.Office.Interop.dll
- read/write数据读写传输方式(转)
- 关于点击空白关闭弹窗的js写法推荐?
- hdu 4790 Just Random 神奇的容斥原理
- why do we need virtual methods in C++?
- js实现两个输入框中的数字相乘并自动将结果显示在第三个输入框
- fs模块(一)
- 2017-04-21周Java学习笔记
- RT-thread嵌入式操作系统相关的问题
- OAuth 2.0 C# 版
- C# Microsoft.Office.Interop.Excel.ApplicationClass 加载类型库/DLL 时出错
- nodejs 负载均衡
- git 撤销add和commit
- springboot项目中js、css静态文件路径访问
- python自学——列表
- 华为交换机VRRP 综合配置示例