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

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

//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 --是否是巢狀的並且只對屬於它自己的家族或屬於它自己的程式集的類可見