在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>的逻辑
}

最新文章

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

热门文章

  1. 阿里云pypi软件包预警
  2. 更新或添加properties文件(保留存在的properties文件的原有格式)
  3. java 队列
  4. vue自定义指令?
  5. Delete、truncate、drop都是删除语句,它们有什么分别?
  6. SpringDataJdbc使用数据库默认值的解决方法
  7. elasticsearch 是如何实现 master 选举的 ?
  8. 什么是 bean 装配?
  9. 简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别 ?
  10. memcached 能够更有效地使用内存吗?