反射
Start with:反射反射程序员的快乐。
1、 反射中心思想
实现动态可扩展应用程序。
反射的核心是Type类,这个类封装了关于类型的元素据,CLR拿着Type信息就可以创建相应的类型。
2、 代码执行过程
C# => 编译器 => DLL/EXE =>CLR/JIT => 机器码
metadata(清单元数据) IL(中间代码)
3、 反射创建类型步骤
第一步:动态加载程序集 Assembly.Load(“Ruanmou.DB.MySql”)
第二步:获取类型 Type type = assembly.GetType(“Ruanmou.DB.MySql.MySqlHelper”)
第三步:创建对象 object helper = Activator.CreateInstance(type)
Dynamic/接口类型
4、 破坏单例
单例的实现:
(1)、构造函数私有化
(2)、静态字段
(3)、静态构造函数里实例化
反射会破坏单例:Activator.CreateInstance(type, true)
5、 泛型类、泛型犯法的反射调用
泛型类:
Type type = assembly.GetType(“Ruanmou.DB.SqlServer.GenericClass`3”)
Type typeMake = type.MakeGenericType(new Type[]{typeof(int), typeof(string)})
泛型方法:
MethodInfo method = type.GetMethod(“Show”)
Var methodNew = method.MakeGenericMethod(new Type[]{…})
methodNew.Invoke(object,参数列表); //静态方法调用时可以不用传object
6、泛型的应用
MVC(无法方法重载反射不支持,只能HttpMethod+特性)
AOP 反射调用方法可以在防范前后执行点别的,只需要在方法上加上一些特性
IOC
7、反射的缺点
(1) 使用麻烦
(2) 避开编译器的检查
(3) 性能(程序启动时就将类型加载在缓存中,且一次正常构造和一次反射构造之间的性能差异可以忽略不记,在上了一定数量级之后性能差异才会显现,要不为啥那么多技术都用反射)