反射

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) 性能(程序启动时就将类型加载在缓存中,且一次正常构造和一次反射构造之间的性能差异可以忽略不记,在上了一定数量级之后性能差异才会显现,要不为啥那么多技术都用反射)

posted @ 2021-05-12 16:20  碗粥  阅读(57)  评论(0编辑  收藏  举报