欢迎光临散文网 会员登陆 & 注册

C#知识梳理——反射

2023-08-16 11:04 作者:羞涩男孩小小明  | 我要投稿

1、反射的基本信息

exe/dll文件主要区别,exe文件有入口

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对象技术的一种补充。

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} );

通过反射操作字段和属性等成员---


C#知识梳理——反射的评论 (共 条)

分享到微博请遵守国家法律