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 @ 2018-11-08 12:11  唐宋元明清2188  阅读(993)  评论(3编辑  收藏  举报