判断类型是否被继承、实现

1.判断是否实现了指定接口

添加测试类:

     public class TestClass2 : TestClass1
{ }
public class TestClass1 : TestClass0
{
public override void TestMethod()
{ }
}
public class TestClass0 : ITestInterface
{
public virtual void TestMethod()
{ }
} public interface ITestInterface
{
}

//true 
var hasInterface = typeof(TestClass2).GetInterfaces().Any(i => i.Name == nameof(ITestInterface));

2.判断是否继承了指定基类

//true
var isSubOfTestClassBase = typeof(TestClass2).IsSubclassOf(typeof(TestClass0));

3.判断是否重写了基类方法

获取指定方法的信息后,可以通过DeclaringType-声明此方法的成员类信息,判断与当前类信息是否一致。

//false  
var hasTestClass2OverrideMethod = typeof(TestClass2).GetMethod(nameof(TestClass0.TestMethod)).DeclaringType.Equals(typeof(TestClass2));
//true
var hasTestClass1OverrideMethod = typeof(TestClass1).GetMethod(nameof(TestClass0.TestMethod)).DeclaringType.Equals(typeof(TestClass1));

以上,也可以使用IsAssignableFrom来统一判断

     /// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var isTypeOfExportMetadata = typeof(IB).IsAssignableFrom(typeof(A));
}
} internal class A : IA
{ }
interface IA:IB
{ } interface IB
{ }

嵌套类、是否可继承等判断

1. 判断类A是否为类B的嵌套类

    public class TestClass
{
public class TestNestedClass
{
}
}

测试:

//true
var isNestedInTestClass= typeof(TestClass).GetNestedTypes().Any(i=>i.Equals(typeof(TestClass.TestNestedClass)));

2. 类/接口的访问类型

  • 判断类A是否可被类B继承
  • 判断接口C是否可被类B继承
  • 判断类A、类B是否在同一嵌套类中(类的访问类型 IsNested 以及 如上4中所述判断是否嵌套在某类中)

通过如下访问类型的组合,进行判断

  • IsNested -- 是否表示其定义嵌套在另一个类型的定义之内的类型
  • IsVisible -- 是否可由程序集之外的代码访问
  • IsNotPublic -- 是否声明为公共类型(true:未声明为公共类型且不是嵌套类型)
  • IsPublic -- 是否声明为公共类型 (true:声明为公共类型且不是嵌套类型)
  • IsNestedPublic -- 是否是嵌套的并且声明为公共的(true:类是嵌套的并且声明为公共的)
  • IsNestedPrivate --是否是嵌套的并声明为私有
  • IsNestedFamily --否是嵌套的并且只能在它自己的家族内可见
  • IsNestedAssembly --是否是嵌套的并且只能在它自己的程序集内可见
  • IsNestedFamANDAssem --是否是嵌套的并且只对同时属于自己家族和自己程序集的类可见
  • IsNestedFamORAssem --是否是嵌套的并且只对属于它自己的家族或属于它自己的程序集的类可见

C# 反射 判断类的延伸类型的更多相关文章

  1. C#反射实现 C# 反射 判断类的延伸类型 使用代码生成工具Database2Sharp快速生成工作流模块控制器和视图代码 C# ADO.NET的SqlDataReader对象,判断是否包含指定字段 页面中添加锚点的几种方式 .net 简单实用Log4net(多个日志配置文件) C# 常用小点

    C#反射实现   一.反射概念: 1.概念: 反射,通俗的讲就是我们在只知道一个对象的内部而不了解内部结构的情况下,通过反射这个技术可以使我们明确这个对象的内部实现. 在.NET中,反射是重要的机制, ...

  2. java 反射获取类的属性 类型 名称和值

    /** * 获取属性类型(type),属性名(name),属性值(value)的map组成的list * */ private List getFiledsInfo(Object o){ Field[ ...

  3. java利用反射获取类的属性及类型

    java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...

  4. php中函数 isset(), empty(), is_null() 的区别,boolean类型和string类型的false判断

    php中函数 isset(), empty(), is_null() 的区别,boolean类型和string类型的false判断 实际需求:把sphinx返回的结果放到ssdb缓存里,要考虑到sph ...

  5. 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)

    面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...

  6. 反射工具类——ReflectUtils

    测试方法:根据已知的方法名,来反射调用方法 package com.redmoon.forum.job; import java.util.ArrayList; import java.util.Li ...

  7. Java反射获取类和对象信息全解析

    反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题. 在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了. 获取类对象 Class.f ...

  8. 多态,封装,反射,类内置attr属性,os操作复习

    1.多态 #多态 多态是指对象如何通过他们共同的属性和动作来操作及访问,而不需要考虑他们具体的类 运行时候,多种实现 反应运行时候状态 class H2O: def __init__(self,nam ...

  9. python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法

    一. 反射 ''' # isinstance class A:pass class B(A):pass a = A() print(isinstance(a,A)) # 判断对象和类的关系 print ...

随机推荐

  1. 常用典型的sql语句

    1.两张表,怎么把一张表中的数据插入到另一张表中? 1,insert into table_a select * from table_b 2,insert into table_a(field_a1 ...

  2. python 防止sql注入字符串拼接的正确用法

    在使用pymysql模块时,在使用字符串拼接的注意事项错误用法1 sql='select * from where id="%d" and name="%s" ...

  3. #利用openCV裁脸

    #利用openCV裁脸import cv2 def draw_rects(img, rects): for x, y, w, h in rects: cv2.rectangle(img, (x, y) ...

  4. Spark学习之RDD编程总结

    Spark 对数据的核心抽象——弹性分布式数据集(Resilient Distributed Dataset,简称 RDD).RDD 其实就是分布式的元素集合.在 Spark 中,对数据的所有操作不外 ...

  5. 跳动在网页中间的精灵----Javascript

    今天开始js的内容整理,跳动在网页里的精灵就是它了. 一.简介 1.什么是Javascript JavaScript 是一种具有面向对象能力的.解释型的程序设计语言.更具体一点,它是基于对象和事件驱动 ...

  6. SQLI LABS Challenges Part(54-65) WriteUp

    终于到了最后一部分,这些关跟之前不同的是这里是限制次数的. less-54: 这题比较好玩,10次之内爆出数据.先试试是什么类型: ?id=1' and '1 ==>>正常 ?id=1' ...

  7. html基础复习

    1.标签选择器   div{}   2.类选择器   .one class="one"   3.id选择器(定义+调用)   #one{} id="one"   ...

  8. 把时间留给重要的事——Markdown 模板功能上线

    你是否遇到过因为同事在任务中过于放飞自我而感到头疼?或者经历过因为内容描写的不系统而导致关键信息被忽视? 现在,CODING Markdown 模板功能将帮助你解决这些困扰. 功能介绍 CODING ...

  9. java:比赛中常用方法整理——字符串(基础)

    一.将字符串转化为字符数组: toCharArray返回一个字符数组. char[] a=J.toCharArray(); 二.字符串的长度 字符串的长度和字符数组的长度是不一'样'的. 字符串长度( ...

  10. 操作系统:diskpart常用指令(使用diskpart实现分区管理)

    配合磁盘管理一起食用,效果最佳.(我的电脑右键 -> 管理 -> 磁盘管理) status:列出主要命令 list:列出list下的命令 select disk 0:选择第一块磁盘 lis ...