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)}"); } }
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
