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 }
//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 }
4. 获取泛型接口内的实参类型
1 /// <summary> 2 /// 获取泛型接口内的实参类型 3 /// 比如:如果A实现了接口ISavable<T>,则返回T的类型 4 /// </summary> 5 /// <param name="objType">对象类型</param> 6 /// <param name="interfaceType">接口类型</param> 7 /// <returns>泛型接口内的实参类型</returns> 8 public static List<Type> GetGenericTypeByInterface(this Type objType, Type interfaceType) 9 { 10 var interfaces = objType.GetInterfaces(); 11 //获取所有接口 12 foreach (var interfaceItem in interfaces) 13 { 14 if (interfaceItem.IsGenericType) 15 { 16 var interfaceDefinition = interfaceItem.GetGenericTypeDefinition(); 17 if (interfaceDefinition == interfaceType) 18 { 19 var genericArguments = interfaceItem.GetGenericArguments(); 20 return genericArguments.ToList(); 21 } 22 } 23 } 24 return new List<Type>(); 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 --是否是嵌套的并且只对属于它自己的家族或属于它自己的程序集的类可见
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)