1. 程式人生 > >C# 反射 判斷類的延伸類型

C# 反射 判斷類的延伸類型

typeof 獲取 nested private 重寫 ride 繼承 並且 訪問

添加測試類:

    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.判斷是否繼承了指定基類

//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));

4.判斷類A是否為類B的嵌套類

    public class TestClass
    {
        public class TestNestedClass
        {
        }
    }

測試:

//true
var 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 --是否是嵌套的並且只對屬於它自己的家族或屬於它自己的程序集的類可見

C# 反射 判斷類的延伸類型