C# 判斷一個類是否繼承指定類


1.類結構

    /// <summary>
    /// 測試繼承-父類
    /// </summary>
    public class TestInheritBase { }
    /// <summary>
    /// 測試繼承-抽象父類
    /// </summary>
    public abstract class TestAbstractInheritBase { }
    /// <summary>
    /// 測試繼承-接口
    /// </summary>
    public interface ITestInheritBase { }
    /// <summary>
    /// 測試繼承-類
    /// </summary>
    public class TestInherit : TestInheritBase, ITestInheritBase
    {
        public TestInherit() { }
        public TestInherit(int num) { }
        public TestInherit(int num, string str) { }

        public int Num { get; set; }
        public string Str { get; set; }

        public void Run() { }
        public void Run(int num) { }
        public void Run(int num, string str) { }

    }
    /// <summary>
    /// 測試繼承-抽象類
    /// </summary>
    public class TestAbstractInherit : TestAbstractInheritBase, ITestInheritBase { }

2.檢查對象是否與給定類型兼容,關鍵字: is

            // 測試類繼承
            var typeTestInherit = typeof(TestInherit);
            var typeTestInheritBase = typeof(TestInheritBase);
            var typeITestInheritBase = typeof(ITestInheritBase);
            // 測試抽象類的繼承
            var typeTestAbstractInherit = typeof(TestAbstractInherit);
            var typeTestAbstractInheritBase = typeof(TestAbstractInheritBase);
            {
                var newTestInherit = new TestInherit();
                var newTestInheritBase = new TestInheritBase();

                _testOutputHelper.WriteLine($"TestInherit 繼承 TestInheritBase:{newTestInherit is TestInheritBase}");// true
                _testOutputHelper.WriteLine($"TestInherit 繼承 ITestInheritBase:{newTestInherit is ITestInheritBase}");// true
                _testOutputHelper.WriteLine($"TestInheritBase 繼承 TestInheritBase:{newTestInheritBase is TestInheritBase}");// true
                _testOutputHelper.WriteLine($"TestInheritBase 繼承 ITestInheritBase:{newTestInheritBase is ITestInheritBase}");// false
            }

3.確定當前 Type 是否派生自指定的 Type,關鍵字:IsSubclassOf 和 IsAssignableFrom

            {
                _testOutputHelper.WriteLine($"TestInherit 繼承 TestInheritBase:{typeTestInherit.IsSubclassOf(typeTestInheritBase)}");// true
                _testOutputHelper.WriteLine($"TestInherit 繼承 ITestInheritBase:{typeTestInherit.IsSubclassOf(typeITestInheritBase)}");// false
                _testOutputHelper.WriteLine($"TestAbstractInherit 繼承 TestAbstractInheritBase:{typeTestAbstractInherit.IsSubclassOf(typeTestAbstractInheritBase)}");// true

                _testOutputHelper.WriteLine($"TestInherit 繼承 TestInheritBase:{typeTestInheritBase.IsAssignableFrom(typeTestInherit)}");// true
                _testOutputHelper.WriteLine($"TestInherit 繼承 ITestInheritBase:{typeITestInheritBase.IsAssignableFrom(typeTestInherit)}");// true
            }

3.1.IsSubclassOf 方法可以用來確定:一個類是否派生自另一個類|ValueType|Enum|委托;不能用於確定:接口是派生自另一個接口,還是類實現接口,詳見文檔

3.2.IsAssignableFrom 方法可以用來確定:接口是派生自另一個接口,還是類實現接口,詳見文檔

4.通過反射獲取父類和繼承的接口

            {
                // 父類
                var baseType = typeTestInherit.BaseType;
                _testOutputHelper.WriteLine($"\nBaseType:\t{baseType.Name}");
                // 接口集合
                var interfaceList = ((TypeInfo)typeTestInherit).ImplementedInterfaces;
                _testOutputHelper.WriteLine($"ImplementedInterfaces:\t{string.Join("\t", interfaceList.Select(x => x.Name))}");
                // 獲取方法
                var itemList = new List<string>();
                foreach (var item in typeTestInherit.GetMethods())
                {
                    var param = item.GetParameters().Select((x, i) => $"{x.ParameterType} {x.Name},簽名位置: {x.Position},是輸出參數: {x.IsOut}");
                    itemList.Add($"{item.Name}:  {string.Join("  |  ", param)}");
                }
                _testOutputHelper.WriteLine($"\nMethods Name:\n\t{string.Join("\n\t", itemList)}");
                itemList.Clear();
                // 獲取構造函數
                foreach (var item in typeTestInherit.GetConstructors())
                {
                    var param = item.GetParameters().Select((x, i) => $"{x.ParameterType} {x.Name},簽名位置: {x.Position},是輸出參數: {x.IsOut}");
                    itemList.Add($"{item.Name}:  {string.Join("  |  ", param)}");
                }
                _testOutputHelper.WriteLine($"Constructor Name:\n\t{string.Join("\n\t", itemList)}");
                itemList.Clear();
                // 獲取屬性
                foreach (var item in typeTestInherit.GetProperties())
                {
                    itemList.Add($"{item.PropertyType}: {item.Name}");
                }
                _testOutputHelper.WriteLine($"Propertie Name:\n\t{string.Join("\t", itemList)}");
            }

5.完整代碼

        [Fact]
        public void TestInherit()
        {
            // 測試類繼承
            var typeTestInherit = typeof(TestInherit);
            var typeTestInheritBase = typeof(TestInheritBase);
            var typeITestInheritBase = typeof(ITestInheritBase);
            // 測試抽象類的繼承
            var typeTestAbstractInherit = typeof(TestAbstractInherit);
            var typeTestAbstractInheritBase = typeof(TestAbstractInheritBase);
            {
                var newTestInherit = new TestInherit();
                var newTestInheritBase = new TestInheritBase();

                _testOutputHelper.WriteLine($"TestInherit 繼承 TestInheritBase: {newTestInherit is TestInheritBase}");// true
                _testOutputHelper.WriteLine($"TestInherit 繼承 ITestInheritBase: {newTestInherit is ITestInheritBase}");// true
                _testOutputHelper.WriteLine($"TestInheritBase 繼承 TestInheritBase: {newTestInheritBase is TestInheritBase}");// true
                _testOutputHelper.WriteLine($"TestInheritBase 繼承 ITestInheritBase: {newTestInheritBase is ITestInheritBase}");// false
            }
            {
                _testOutputHelper.WriteLine($"\nTestInherit 繼承 TestInheritBase: {typeTestInherit.IsSubclassOf(typeTestInheritBase)}");// true
                _testOutputHelper.WriteLine($"TestInherit 繼承 ITestInheritBase: {typeTestInherit.IsSubclassOf(typeITestInheritBase)}");// false
                _testOutputHelper.WriteLine($"TestAbstractInherit 繼承 TestAbstractInheritBase: {typeTestAbstractInherit.IsSubclassOf(typeTestAbstractInheritBase)}");// true

                _testOutputHelper.WriteLine($"\nTestInherit 繼承 TestInheritBase: {typeTestInheritBase.IsAssignableFrom(typeTestInherit)}");// true
                _testOutputHelper.WriteLine($"TestInherit 繼承 ITestInheritBase: {typeITestInheritBase.IsAssignableFrom(typeTestInherit)}");// true
            }
            {
                // 父類
                var baseType = typeTestInherit.BaseType;
                _testOutputHelper.WriteLine($"\nBaseType:\t{baseType.Name}");
                // 接口
                var interfaceList = ((TypeInfo)typeTestInherit).ImplementedInterfaces;
                _testOutputHelper.WriteLine($"ImplementedInterfaces:\t{string.Join("\t", interfaceList.Select(x => x.Name))}");
                // 獲取方法
                var itemList = new List<string>();
                foreach (var item in typeTestInherit.GetMethods())
                {
                    var param = item.GetParameters().Select((x, i) => $"{x.ParameterType} {x.Name},簽名位置: {x.Position},是輸出參數: {x.IsOut}");
                    itemList.Add($"{item.Name}:  {string.Join("  |  ", param)}");
                }
                _testOutputHelper.WriteLine($"\nMethods Name:\n\t{string.Join("\n\t", itemList)}");
                itemList.Clear();
                // 獲取構造函數
                foreach (var item in typeTestInherit.GetConstructors())
                {
                    var param = item.GetParameters().Select((x, i) => $"{x.ParameterType} {x.Name},簽名位置: {x.Position},是輸出參數: {x.IsOut}");
                    itemList.Add($"{item.Name}:  {string.Join("  |  ", param)}");
                }
                _testOutputHelper.WriteLine($"Constructor Name:\n\t{string.Join("\n\t", itemList)}");
                itemList.Clear();
                // 獲取屬性
                foreach (var item in typeTestInherit.GetProperties())
                {
                    itemList.Add($"{item.PropertyType}: {item.Name}");
                }
                _testOutputHelper.WriteLine($"Propertie Name:\n\t{string.Join("\t", itemList)}");
            }
        }
View Code

6.輸出日志

TestInherit 繼承 TestInheritBase: True
TestInherit 繼承 ITestInheritBase: True
TestInheritBase 繼承 TestInheritBase: True
TestInheritBase 繼承 ITestInheritBase: False

TestInherit 繼承 TestInheritBase: True
TestInherit 繼承 ITestInheritBase: False
TestAbstractInherit 繼承 TestAbstractInheritBase: True

TestInherit 繼承 TestInheritBase: True
TestInherit 繼承 ITestInheritBase: True

BaseType:    TestInheritBase
ImplementedInterfaces:    ITestInheritBase

Methods Name:
    get_Num:  
    set_Num:  System.Int32 value,簽名位置: 0,是輸出參數: False
    get_Str:  
    set_Str:  System.String value,簽名位置: 0,是輸出參數: False
    Run:  
    Run:  System.Int32 num,簽名位置: 0,是輸出參數: False
    Run:  System.Int32 num,簽名位置: 0,是輸出參數: False  |  System.String str,簽名位置: 1,是輸出參數: False
    GetType:  
    ToString:  
    Equals:  System.Object obj,簽名位置: 0,是輸出參數: False
    GetHashCode:  
Constructor Name:
    .ctor:  
    .ctor:  System.Int32 num,簽名位置: 0,是輸出參數: False
    .ctor:  System.Int32 num,簽名位置: 0,是輸出參數: False  |  System.String str,簽名位置: 1,是輸出參數: False
Propertie Name:
    System.Int32: Num    System.String: Str
View Code

 


免責聲明!

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



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