c#反射学习01
- 反射学习
- 一、反射原理
- 二、那么我们是如何通过metadata来实现反射呢?
- 三、反射的好处
- 四、反射创建对象(利用配置文件+简单工厂+反射)
- 五、反射的黑科技(多构造函数调用、破坏单例、创建泛型)
- 六、反射调用实例方法、静态方法、重载方法
反射学习
一、反射原理
反射的原理本质上是拿取DLL/EXE文件中的元数据metadata, 因为metadata中存放的是命名空间、类名、属性名、特性等记录下来,中间语言IL中存放的是方法、实体类等)
二、那么我们是如何通过metadata来实现反射呢?
(1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。
(2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
(3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。
(4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。
(5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。
(6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。
(7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。
(8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。
1、动态读取dll
//1、动态读取dll的三种方式 //(1)LoadFrom:dll全名称,需要后缀
Assembly assembly = Assembly.LoadFrom(“Business.DB.SqlServer.dll”);
//(2)LoadFile:全路径,需要dll后缀 //Assembly assembly1 =
Assembly.LoadFile(@“dll文件全路径”); //(3)Load:dll名称 不需要后缀 //Assembly
assembly2 = Assembly.Load(“Business.DB.SqlServer”);
2、获取反射对象类型
//2、获取某一个具体的类型,参数需要是类的全名称
Type type1 = assembly.GetType(“Business.DB.SqlServer.SqlServerHelper”);
3、根据获得的反射对象类型创建反射对象,但此时生成的实际对象在编译声明时依然是OBJECT对象
object oDBHelper = Activator.CreateInstance(typeDBHelper);
4、强制对象类型转换
IDBHelper iDBHelper = oDBHelper as IDBHelper;
5、通过创建的反射对象调用,实现反射(反射+简单工厂+配置文件)
三、反射的好处
反射在不添加引用,不NEW对象的情况下,可以动态调取对象中的方法
四、反射创建对象(利用配置文件+简单工厂+反射)
五、反射的黑科技(多构造函数调用、破坏单例、创建泛型)
1、多构造函数的调用
上面反射都是调用类的无参构造函数,
2、调用私有的构造函数(破坏单例)
先说说单例模式,单例模式就是为了在我们的进程中
3、创建泛型
六、反射调用实例方法、静态方法、重载方法
1、调用实例方法
2、调用静态方法
3、调用重载方法
参照:https://blog.csdn.net/ananlele_/article/details/107979117