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


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

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

    添加测试类:

     1     public class TestClass2 : TestClass1
     2     {
     3 
     4     }
     5     public class TestClass1 : TestClass0
     6     {
     7         public override void TestMethod()
     8         {
     9 
    10         }
    11     }
    12     public class TestClass0 : ITestInterface
    13     {
    14         public virtual void TestMethod()
    15         {
    16 
    17         }
    18     }
    19 
    20     public interface ITestInterface
    21     {
    22     }
    View Code

    //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来统一判断

     1     /// <summary>
     2     /// MainWindow.xaml 的交互逻辑
     3     /// </summary>
     4     public partial class MainWindow : Window
     5     {
     6         public MainWindow()
     7         {
     8             InitializeComponent();
     9             var isTypeOfExportMetadata =  typeof(IB).IsAssignableFrom(typeof(A));
    10         }
    11     }
    12 
    13     internal class A : IA
    14     {
    15 
    16     }
    17     interface IA:IB
    18     {
    19         
    20     }
    21 
    22     interface IB
    23     {
    24         
    25     }

      

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

    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 --是否是嵌套的并且只对属于它自己的家族或属于它自己的程序集的类可见
  • 相关阅读:
    让tomcat启动时,自动加载你的项目
    ssh整合 小例子
    hibernate入门(二)
    java引用问题(—)
    hibernate入门(-)
    IOC入门1
    百度知道回答的依赖注入
    spring
    ibatis 优点,未完版
    Data Structure Array: Sort elements by frequency
  • 原文地址:https://www.cnblogs.com/kybs0/p/9928329.html
Copyright © 2020-2023  润新知