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

判斷類型是否被繼承、實現

1.判斷是否實現了指定接口ide

添加測試類:測試

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

//true
var isSubOfTestClassBase = typeof(TestClass2).IsSubclassOf(typeof(TestClass0));

3.判斷是否重寫了基類方法code

獲取指定方法的信息後,能夠經過DeclaringType-聲明此方法的成員類信息,判斷與當前類信息是否一致。blog

//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
        {
        }
    }

測試:it

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

2. 類/接口的訪問類型event

  • 判斷類A是否可被類B繼承
  • 判斷接口C是否可被類B繼承
  • 判斷類A、類B是否在同一嵌套類中(類的訪問類型 IsNested 以及 如上4中所述判斷是否嵌套在某類中)

經過以下訪問類型的組合,進行判斷class

  • IsNested -- 是否表示其定義嵌套在另外一個類型的定義以內的類型
  • IsVisible -- 是否可由程序集以外的代碼訪問
  • IsNotPublic -- 是否聲明爲公共類型(true:未聲明爲公共類型且不是嵌套類型)
  • IsPublic -- 是否聲明爲公共類型 (true:聲明爲公共類型且不是嵌套類型)
  • IsNestedPublic -- 是不是嵌套的而且聲明爲公共的(true:類是嵌套的而且聲明爲公共的)
  • IsNestedPrivate --是不是嵌套的並聲明爲私有
  • IsNestedFamily --否是嵌套的而且只能在它本身的家族內可見
  • IsNestedAssembly --是不是嵌套的而且只能在它本身的程序集內可見
  • IsNestedFamANDAssem --是不是嵌套的而且只對同時屬於本身家族和本身程序集的類可見
  • IsNestedFamORAssem --是不是嵌套的而且只對屬於它本身的家族或屬於它本身的程序集的類可見
相關文章
相關標籤/搜索