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)}"); } }
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2018-09-09 NET 集合[for/循环]分页查询