C#知识梳理——反射
1、反射的基本信息
exe/dll文件主要区别,exe文件有入口

metadata元数据—描述exe/dll文件的数据清单 记录了有哪些类、属性等之类的-----通过反射(reflection)获取元数据中的数据
【1】 更新程序时(更新自己的Dll)
【2】 使用别人的DLL文件(这种可以读取别人的私有的内容)
反射是什么?:操作metadata的一个工具(类库,用来读取或者操作元数据—类 方法 特性 属性字段 )
为什么要通过反射间接去操作呢?:1、因为我们需要动态,不要写死的。2、读取私有的内容
使用场合:比如 asp.net MVC ---ORM---LOC---AOP 几乎所有的框架都会使用这个反射
总而言之—反射,即一个工具,用来操作元数据。
2、通过反射加载DLL文件
每个项目都会生成一个dll 不管是什么方法引用dll 都最好先把所引用文件放到当前目录下 不然只能通过完全路径引用了
通过反射创建对象
步骤:获取dll->获取type=>object创建对象->类型转换褪去object的皮->正常使用
通过反射创建对象 (带参数)
其实带参数的和不带参数的是一样的,区别就是一个方法的不同传参、调用、匹配
步骤:获取dll->获取type=>object创建对象(按照参数的类型、个数、顺序在Activator.CreateInstance)中写入,其会自动匹配->类型转换褪去object的皮->正常使用
通过反射创建对象(私有构造函数)
什么是私有构造函数?à含有私有字段,不能直接实例化,因为私有构造函数有其保护机制。
步骤:获取dll->获取type=>object创建对象(Activator.CreateInstance创建对象时要传入true)中写入,其会自动匹配->类型转换褪去object的皮->正常使用
这个功能还用在单例模式里 (一个对象只能创建一次)

通过反射创建对象(泛型类)
步骤:获取dll->获取type(获取到类名称,根据泛型格式,利用占位符`来规范格式)=> genertype.MakeGenericType 根据泛型要求使用typeof给泛型赋类 ->object创建对象(Activator.CreateInstance创建对象时要传入true)中写入,其会自动匹配->类型转换褪去object的皮->正常使用
通过反射调用方法
其实在上文已经提到过了一种方法,即通过反射调用类型,创建对象,然后可以调用方法。
这是另外一种方式。
反射与MVC和AOP
MVC本质还是通过反射起的作用
我们反射,其实是dll文件名称+类型名称+方法名称=我们的方法
而MVC

看起来是不是很像MVC的结构?其实打开这个网页,也就是调用了这个方法。
反射在MVC中有缺点存在:不能通过参数匹配的方式去匹配方法!所以要在MVC中加入请求类型用以区分(像重载这种情况)

APO==是一种面前切面编程。是OOP对象技术的一种补充。
通过反射调用私有方法
前边讲到过用反射创建对象(私有构造函数),通过反射调用私有方法与之还是有些区别的。
步骤:获取dll->获取type(获取到类名称)=> object创建对象-> MethodInfo 创建容器保存type。GetMethon获得的方法类型,而在GetMethon中使用BindingFlags 与|逻辑运算符给出组合条件参数-> methodInfo.Invoke(obj,new object[] { xxx} );正常使用
通过反射调用泛型方法
之前讲过通过反射创建泛型对象

普通类中泛型方法的调用---
步骤:获取dll->获取type(获取到类名称)=> object创建对象-> MethodInfo 创建容器保存type.GetMethon获得的方法类型-> MethodInfo .MakeGenericMethod(new object[] { typeof(int), typeof(string)...... }确定方法的类型和个数–> methodInfo.Invoke(obj,new object[] { xxx} );正常使用
泛型类中泛型方法的调用—
步骤:获取dll->获取type(获取到类名称,用占位符获取参数个数)=> 获取typenew(MakeGenericType确定泛型方法的参数类型)=> object创建对象-> MethodInfo 创建容器保存typenew.GetMethon获得的方法类型-> MethodInfo .MakeGenericMethod(new object[] { typeof(int), typeof(string)...... }确定方法的类型和个数–> methodInfo.Invoke(obj,new object[] { xxx} );
通过反射操作字段和属性等成员---