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

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. js面试题1

    1.介绍js的基本数据类型 Undefined.Null.Boolean.Number.String 2.js有哪些内置对象? 数据封装类对象:Object.Array.Boolean.Number ...

  2. 循环神经网络之LSTM和GRU

    看了一些LSTM的博客,都推荐看colah写的博客<Understanding LSTM Networks> 来学习LSTM,我也找来看了,写得还是比较好懂的,它把LSTM的工作流程从输入 ...

  3. KnockOut 绑定之foreach绑定

    foreach绑定对于数组中的每一个元素复制一节标记语言,也就是html,并且将这节标记语言和数组里面的每一个元素绑定.当我们呈现一组list数据,或者一个表格的时候,十分有用. 如果你绑定的数组是一 ...

  4. CSharpGL(53)漫反射辐照度

    CSharpGL(53)漫反射辐照度 本系列将通过翻译(https://learnopengl.com)这个网站上关于PBR的内容来学习PBR(Physically Based Rendering). ...

  5. Unity 捏脸整理及基于骨骼的捏脸功能实现

    目前实现捏脸功能的方式主要有两种.一个是Blendshape(融合变形),一个是基于骨骼驱动的方式,通过修改骨骼矩阵(bindpose)来影响SkinMesh.这两种方式的最终原理都是在shader ...

  6. 史诗级Java资源大全中文版

    本文来自GitHub 上 Awesome - java 系列的资源整理.awesome-java 就是 akullpp 发起维护的 Java 资源列表,内容包括:构建工具.数据库.框架.模板.安全.代 ...

  7. Ubuntu 18.04编译AOSP源码

    总结一下我从Ubuntu 18.04下编译成功AOSP的过程,以及遇到的坑 我的电脑配置: OS: Ubuntu 18.04 bionic Kernel: x86_64 Linux 4.18.0-17 ...

  8. appium+python搭建自动化测试框架_Tools安装(一)

    作者的配置环境和版本: win10 + python3.6 +  Appium v1.4.16 1.下载node   https://nodejs.org/en/download/, 下载node.j ...

  9. 如何使用 Enterprise Architect 画 UML

    本文同时发布于http://fantasylion.github.io/tools/How-to-use-EA 重识 EA (Enterprise Architect) 公司使用的 OMS 是从外面买 ...

  10. CASE 表达式

    通过本篇文章我们来学习一下CASE表达式的基本使用方法. CASE表达式有简单 CASE表达式(simple case expression)和搜索 CASE表达式(searched caseexpr ...