C# 反射 判断类的延伸类型

添加测试类:

    public class TestClass2 : TestClass1
    {

    }
    public class TestClass1 : TestClass0
    {
        public override void TestMethod()
        {

        }
    }
    public class TestClass0 : ITestInterface
    {
        public virtual void TestMethod()
        {

        }
    }

    public interface ITestInterface
    {
    }

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

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

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

//truevar isSubOfTestClassBase = typeof(TestClass2).IsSubclassOf(typeof(TestClass0));

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

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

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

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

    public class TestClass
    {
        public class TestNestedClass
        {
        }
    }

测试:

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

5. 类/接口的访问类型

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

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

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

原文地址:https://www.cnblogs.com/kybs0/p/9928329.html

时间: 2024-08-10 16:11:32

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

C#用反射判断一个类型是否是Nullable同时获取它的根类型(转自网络)

在我们的应用程序中我们使用类描述我们的业务对象,为我们产生一些报表之类的,那就依赖大量不同的对象,我们创建一个帮助方法来转换我们的业务对象,或是一个List的业务对象到DataTables. 由于数据库表中字段可为null,对应.net 2.0以后我们可用Nullable类型来实现,那当我们业务对象类中字段有null时,并需要转换为DataTable时,这个场景产生,你可能用到以下方法: 下面的代码是一个list对象(不支持处理复杂类型)返回一个描述对象的DataTable /// <summa

反射工具类——ReflectUtils

测试方法:根据已知的方法名,来反射调用方法 package com.redmoon.forum.job; import java.util.ArrayList; import java.util.List; import com.common.utils.ReflectUtils; public class Test { private String name; public String getName() { return name; } public void setName(String

黑马程序员——Java基础---反射Class类、Constructor类、Field类

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 反射的应用场景 一.概述 反射技术: Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的

反射操作工具类

using System; using System.Collections.Generic; using System.Data; using System.Reflection; namespace Framework.Utility { /// <summary> /// 反射操作工具类 /// </summary> public class ReflectionUtil { #region 根据反射机制将dataTable中指定行的数据赋给obj对象 /// <sum

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

反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题. 在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了. 获取类对象 Class.forName(String clazzName)静态方法 调用类的class属性,Person.class返回的就是Person的class对象(推荐使用) 调用某个对象的getClass()方法 具体使用还是要根据实际来选择,第一种方式是比较自由的,只要知道一个类名就可以了,其不会做该类是否存在的

C#反射操作工具类

在C#中通过反射机制将查询到的DataTable或DataReader转换成相对应的对象类型. 1 /// <summary> 2 /// 反射操作工具类 3 /// </summary> 4 public class ReflectionUtil 5 { 6 #region 根据反射机制将dataTable中指定行的数据赋给obj对象 7 8 /// <summary> 9 /// 根据反射机制将dataTable中指定行的数据赋给obj对象 10 /// </

读取配置文件,利用反射给类属性赋值,

背景:项目中用的全局变量,一般通过形如 pubic static final String ABC="abc";然后在项目中用类.属性名的方式调用. 如果变量的值并不固定.比如不同客户定义的值不同,就不能用final修饰.只能用public static String ABC;方式来声明,也可加默认初始值: 这个时候我们就需要一个初始化方法(init())来对变量进行初始化赋值,让其变得有意义. 因为值需要从配置文件中读取,传统方法,可能是根据属性的set方法一个一个设置.假如有10个

ReflectUtil反射工具类

原文:https://blog.csdn.net/u011704894/article/details/50548925 ReflectUtil: import java.lang.reflect.Field; import java.lang.reflect.Method; /** * Java反射工具类<br> * 提供以下几个功能:<br> * 1. 取最简类名<br> * 2. 动态赋值<br> * 3. 动态取值<br> * 4. 判断

7.28 多态 反射 元类

多态 1.什么是多态 多态指的是一类事物有多种形态 例如: 动物有多种形态: 人,狗,猪 在程序中多态指的是,不同对象可以响应相同方法,并可以有自己不同的实现方式 2.为什么需要多态 案例分析: import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.abstractmethod def talk(self): pass class People(Animal): #动物的形态之一:人 def talk(self): prin