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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM