一、C# 反射(refection)基础概念
反射指程序可以访问、检测和修改它本身状态或行为的一种能力。
程序集包含模块,而模块包含类型,类型又包含成员。
反射则提供了封装程序集、模块和类型的对象。
您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
反射提供了封装程序集、模块和类型的对象(反射的层次模型为:程序集包含模块,而模块包含类型,类型又包含成员【成员--->类型--->模块--->程序集】)其中类型可以是(类、结构、枚举)。
优点:
缺点:
二、C# 反射的使用场景
三、C# 反射获取类型方式
1.类型:Type
- 1
- //通过Typeof获取某个值的类型
-
- System.Type type = typeof(PeopleInfo);
-
- 2
- //通过GetType获取对象类型
-
- PeopleInfo peopleInfo = new PeopleInfo();
- peopleInfo.Age = 23;
- System.Type type1 = peopleInfo.GetType();
- System.Type type2 = peopleInfo.Age.GetType();
-
-
- 3
- //通过GetType获取类名称类型
-
- System.Type type = System.Type.GetType("Test_Reflection.PeopleInfo");
2.成员:MethodInfo ,方法,字段,属性
成员字段:FieldInfo
成员属性:PropertyInfo
3.实例化:Activator 获取反射类型的三种方式
序号 获取反射类型的三种方式
Activator反射不同的构造进行实例化对象
- 序号 Activator方法 说明
- 1 CreateInstance(Type t) 使用默认Public修饰的无参数构造实例化对象
- 2 CreateInstance(Type,bool nonPublic) 使用Private修饰的无参构造实例化对象
- 3 CreateInstance(Type type, params object?[]? args) 使用Public修饰的有参构造实例化对象
- 4 CreateInstance(Type type, object?[]? args, object?[]? activationAttributes) 使用Public修饰的有参构造和公有属性实例化对象
- 5 CreateInstance(Type type, BindingFlags bindingAttr, Binder? binder, object?[]? args, CultureInfo? culture) 使用指定的BindingFlags组合,可选有无参数构造实例化对象
使用的命名空间
使用反射需要引用命名空间【using System.reflection】,这个命名空间包含如下的类:
System.Reflection命名空间包含的主要类
- 序号 System.Reflection命名空间包含的主要类(反射涉及到的类)
- 1 System.Reflection.Assembly
- 2 System.Reflection.MemberInfo
- 3 System.Reflection.EventInfo
- 4 System.Reflection.FieldInfo
- 5 System.Reflection.MethodBase
- 6 System.Reflection.ConstructorInfo
- 7 System.Reflection.MethodInfo
- 8 System.Reflection.PropertyInfo
- 9 System.Type
更多: