有时我们需要判断某个类是否实现了某个接口(Interface),比如在使用反射机制(Reflection)来查找特定类型的时候。

简单来说,可以使用Type.IsAssignableFrom方法:

1
2
typeof(IFoo).IsAssignableFrom(bar.GetType());
typeof(IFoo).IsAssignableFrom(typeof(BarClass));

从字面意思可以看出,IsAssignableFrom表示BarClass类型能否赋值给IFoo接口,所以它返回true的条件就是BarClass直接或间接实现了IFoo接口。Type类型中还有一个方法是IsSubclassOf,它只能用于判断类的继承关系,比如

1
typeof(FooClass).IsSubclassOf(typeof(BarClass)) == true

表示FooClass是继承自BarClass。

当然IsAssignableFrom也可以用来判断继承关系。

于是,对于以下的代码:

1
2
3
interface I { /* ... */ }
class A : I { /* ... */ }
class B : A { /* ... */ }

IsSubclassOf和IsAssignableFrom的返回值为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typeof(A).isAssignableFrom(typeof(I)); // false
typeof(A).isSubClassOf(typeof(I)); // false
typeof(I).isAssignableFrom(typeof(A)); // true
typeof(I).isAssignableFrom(typeof(B)); // true
typeof(B).isSubClassOf(typeof(I)); // false
typeof(A).isAssignableFrom(typeof(A)); // true
typeof(A).isSubClassof(typeof(A)); // false
typeof(A).isAssignableFrom(typeof(B)); // true
typeof(A).isSubClassof(typeof(B)); // false
typeof(B).isAssignableFrom(typeof(A)); // false
typeof(B).isSubClassof(typeof(A)); // true

转载于:https://www.cnblogs.com/lip-blog/p/9131916.html

在C#中判断某个类是否实现了某个接口相关推荐

  1. 【Binder 机制】AIDL 分析 ( 创建 AIDL 文件 | 创建 Parcelable 类 | AIDL 中使用 Parcelable 类 | 编译工程生成 AIDL 对应的Java源文件 )

    文章目录 一.创建 AIDL 文件 1.创建 AIDL 目录 2.创建 AIDL 文件 3.创建 Parcelable 类 4.AIDL 目录下声明 Parcelable 类 5.AIDL 中使用 P ...

  2. ASM 判定一个类,实现了指定接口

    为什么80%的码农都做不了架构师?>>>    ASM 判定一个类,实现了指定接口 技术支持 ASM 中,ClassReader 类:对已存在的进行解析,并提供获取类信息的方法. 通 ...

  3. Python编程语言学习:python的列表的特殊应用之一行命令实现if判断中的两类判断

    Python编程语言学习:python的列表的特殊应用之一行命令实现if判断中的两类判断 目录 python的列表的特殊应用 一行命令实现if判断中的两类判断 python的列表的特殊应用 一行命令实 ...

  4. C#判断一个类中有无指定名称的方法

    C#中可以通过反射分析元数据来解决这个问题,示例代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...

  5. java throwable判断,判断(2分) Java语言中的所有异常类都是java.lang.Throwable的子类。...

    判断(2分) Java语言中的所有异常类都是java.lang.Throwable的子类. 更多相关问题 This artical is probably ________. 某企业2010年12月3 ...

  6. python中的新式类与旧式类的一些基于descriptor的概念(上)

    python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...

  7. java判断一个对象是否为空_Java中判断对象是否为空的方法的详解

    首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.util包下的.这两种StringU ...

  8. java 返回值判断_在Java中判断方法重载的条件除了参数外,还可以通过返回值类型判断。_学小易找答案...

    [单选题]若int x;且有下面的程序片断,则输出结果是() . for (x=3; x<6; x++) { printf((x%2) ? "##%d" : "** ...

  9. Delphi中的线程类

    Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchr ...

最新文章

  1. 前端自动化构建工具webpack (二)之css和插件加载总结
  2. Python会消亡吗?
  3. vue+file-saver+xlsx导出table为excel
  4. c++ 判断nil_golang A=nil,B=A,but B!=nil 这是真的
  5. kubernetes集群搭建以及遇到的问题
  6. hdu 1317 XYZZY【Bellheman_ford 判断正环小应用】
  7. linux7做服务器,centos7 搭建yum服务器
  8. 消解原理推理_什么是推理统计中的Z检验及其工作原理?
  9. 全网都在看的Fiddler、mitmproxy抓包秘籍,花钱都买不到
  10. sqlserver 参数化查询 允许为null_关于SQL Server的insert执行的秘密(上)一个最简单的insert分析...
  11. 【译】前端框架技术选型 React vs. Vue (vs. Angular)
  12. Mysql 默认约束 now_MYSQL中怎样设列的默认值为Now()的介绍
  13. 大型网站架构系列:20本技术书籍推荐
  14. 太赞了!终于有人把怎么在IDEA中使用Java热部署插件JRebel讲清楚了...
  15. mix2线刷开发板救砖_小米小米Mix 2手机快速救砖,线刷教程分享,小白轻松救活手机...
  16. RMI(Remote Method Invocation)原理浅析
  17. opencv学习日记
  18. 如何测试网站服务器安全性,怎么检测网站安全性?
  19. LeCo-200. 岛屿数量
  20. html调用一言api,纯 JavaScript 实现网站一言功能

热门文章

  1. ELK6.0日志从收集到处理完整版教程(二)
  2. Tomcat学习--源码导入和运行
  3. 1、检测是用那个浏览器打开的
  4. 轻松精通数据库管理之道——运维巡检之六(作业运行情况)
  5. Virtual Box创建共享目录
  6. DBA_Oracle性能优化的基本方法概述(方法论)
  7. Nginx 限制并发连接数。
  8. 推测用户行为 程序员分享Android开发经验
  9. 机器学习实践笔记(二)EOF
  10. asp sql 导出 excel_使用SQL进行数据分析(八)