C# 反射 判断类的延伸类型
程序员文章站
2022-05-18 17:21:57
添加测试类: 1.判断是否实现了指定接口 2.判断是否继承了指定基类 3.判断是否重写了基类方法 获取指定方法的信息后,可以通过DeclaringType-声明此方法的成员类信息,判断与当前类信息是否一致。 4.判断类A是否为类B的嵌套类 测试: 5. 类/接口的访问类型 判断类A是否可被类B继承 ......
添加测试类:
public class testclass2 : testclass1 { } public class testclass1 : testclass0 { public override void testmethod() { } } public class testclass0 : itestinterface { public virtual void testmethod() { } } public interface itestinterface { }
1.判断是否实现了指定接口
//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));
4.判断类a是否为类b的嵌套类
public class testclass { public class testnestedclass { } }
测试:
//true
var isnestedintestclass= typeof(testclass).getnestedtypes().any(i=>i.equals(typeof(testclass.testnestedclass)));
5. 类/接口的访问类型
- 判断类a是否可被类b继承
- 判断接口c是否可被类b继承
- 判断类a、类b是否在同一嵌套类中(类的访问类型 isnested 以及 如上4中所述判断是否嵌套在某类中)
通过如下访问类型的组合,进行判断
- isnested -- 是否表示其定义嵌套在另一个类型的定义之内的类型
- isvisible -- 是否可由程序集之外的代码访问
- isnotpublic -- 是否声明为公共类型(true:未声明为公共类型且不是嵌套类型)
- ispublic -- 是否声明为公共类型 (true:声明为公共类型且不是嵌套类型)
- isnestedpublic -- 是否是嵌套的并且声明为公共的(true:类是嵌套的并且声明为公共的)
- isnestedprivate --是否是嵌套的并声明为私有
- isnestedfamily --否是嵌套的并且只能在它自己的家族内可见
- isnestedassembly --是否是嵌套的并且只能在它自己的程序集内可见
- isnestedfamandassem --是否是嵌套的并且只对同时属于自己家族和自己程序集的类可见
- isnestedfamorassem --是否是嵌套的并且只对属于它自己的家族或属于它自己的程序集的类可见
推荐阅读
-
C# 反射 判断类的延伸类型
-
C#难点逐个击破(5):类的访问类型
-
详解C# 利用反射根据类名创建类的实例对象
-
C#的数据类类型和SQLSERVER数据库的类型对照表一览
-
C#程序编写高质量代码改善的157个建议【13-15】[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]
-
C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串的方法
-
C# 通过反射获取类型的字段值及给字段赋值的操作
-
C#实现利用反射简化给类字段赋值的方法
-
c# 类的反射实例 (GetType().Invoke().GetMethod().CreateInstance())
-
PHP 进阶篇:面向对象的设计原则,自动加载类,类型提示,traits,命名空间,spl的使用,反射的使用,php常用设计模式 (麦子学员 第三阶段)