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

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. React Native开发 - 搭建React Native开发环境

    移动开发以前一般都是原生的语言来开发,Android开发是用Java语言,IOS的开发是Object-C或者Swift.那么对于开发一个App,至少需要两套代码.两个团队.对于公司来说,成本还是有的. ...

  2. 利用策略模式优化过多 if else 代码

    前言 不出意外,这应该是年前最后一次分享,本次来一点实际开发中会用到的小技巧. 比如平时大家是否都会写类似这样的代码: if(a){ //dosomething }else if(b){ //dosh ...

  3. 【JVM虚拟机】(6)---深入理解Class中访问标志、类索引、父类索引、接口索引

    JVM(6)访问标志,类索引 上一篇博客讲[JVM虚拟机](5)---深入理解JVM-Class中常量池 我们知道一个class文件正常可以分为7个部分: 魔数与class文件版本 常量池 访问标志 ...

  4. 『简单dp测试题解』

    这一次组织了一场\(dp\)的专项考试,出了好几道经典的简单\(dp\)套路题,特开一篇博客写一下题解. Tower(双向dp) Description 信大家都写过数字三角形问题,题目很简单求最大化 ...

  5. 使用强类型实体Id来避免原始类型困扰(一)

    原文地址:https://andrewlock.net/using-strongly-typed-entity-ids-to-avoid-primitive-obsession-part-1/ 作者: ...

  6. .netcoreapp 发布到 linux 的问题,vs靠不住

    .netcore 2.0 发布后,小版本更新速度惊人 截止目前:2.1.200 最新一个新项目,vs发布到linux@debian9一直报错,反复发布n次依然失败.把本地2.1.100更新到最新2.1 ...

  7. POLARDB · 最佳实践 · POLARDB不得不知道的秘密

    ## 前言 POLARDB作为阿里云下一代关系型云数据库,自去年9月份公测以来,收到了不少客户的重点关注,今年5月份商业化后,许多大客户开始陆续迁移业务到POLARDB上,但是由于POLARDB的很多 ...

  8. Google XSS Challenge

    https://xss-game.appspot.com/level1 https://xss-game.appspot.com/level1 payload: <svg onload=aler ...

  9. iOS----------has copy command from(bug修复)

    :-1: Multiple commands produce '/Users/apple/Library/Developer/Xcode/DerivedData/Pic-frfhvoheijeiybf ...

  10. MTK Camera相关的Makefile Option详解

    列举了所有Camera相关的MakefileOption,并对其功能含义和OptionValues做了详细的解释.[KEYWORD]Others[SOLUTION]YUVCAM_INTERPOLATI ...