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     }
复制代码

  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 --是否是嵌套的并且只对属于它自己的家族或属于它自己的程序集的类可见

 

posted @   唐宋元明清2188  阅读(1024)  评论(3编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示
哥伦布
01:11发布
哥伦布
01:11发布
8°
西北风
2级
空气质量
相对湿度
81%
今天
中雨
3°/15°
周四
大雨
2°/14°
周五
小雨
4°/10°