C#高级 反射(Reflection)

今天和大家聊一聊c#中的反射问题, 和一些他的优点 以及缺点。

这些是自己在一些学习资料中收集的一些理论知识,希望大家多多补充。

反射指程序可以访问、检测和修改它本身状态或行为的一种能力。
程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
有关程序及其类型的数据被称为元数据(metadata),它们保存在程序的程序集中。
程序在运行时,可以查看其他程序集或其本身的元数据。一个运行的程序査看本身的元数据或其他程序的元数据的行为叫做反射(reflection).

反射(Reflection)的用途
1.它允许在运行时查看特性(attribute)信息。
2.它允许审查集合中的各种类型,以及实例化这些类型。
3.它允许延迟绑定的方法和属性(property)。
4.它允许在运行时创建新类型,然后使用这些类型执行一些任务。

type类的部分成员:
在这里插入图片描述

反射获取方法及执行:
1.获取类型信息Type type = my.GetType();
2.根据类型创建对象Activator.CreateInstance(type);
3.获取方法的信息 type.GetMethod(“MyFun”);
4.调用方法的一些标志位BindingFlags.Public
5.执行方法method.Invoke

反射获取属性:
1.获取类型信息Type type = my.GetType();
2.根据类型创建对象Activator.CreateInstance(type);
3.获取属性名 type.GetProperty(“Number”)
4.获取属性值SetValue(dObj,100,null)

反射程序集
Assembly.LoadFile :方法可以从指定文件中加载程序集,通过查找程序集的AssemblyRef元数据表,得知所有引用和需要的程序集
与 Assembly.LoadFrom:从一个指定文件中加载程序集,它和LoadFrom()的不同之处在于LoadFile()不会加载目标程序集所引用和依赖的其他程序集。需要自己控制并显示加载所有依赖的程序集

绑定:在使用类(实例化类并使用类的实例)的程序集与定义类的程序集之间会建立一个联系。这个联系就是是使用类的程序集对类中的方法调用与与定义类的程序集中的物理地址之间的对应关系。通过这个联系,类的方法被调用时线程才能继续执行下去。

前期绑定:由编译器在根据.Net源代码创建程序集的期间创建。相当于直接引用一个类,声明并实例化。

后期绑定:使用类的程序集在编译的时候并没有引用定义类的程序集中的类型。
绑定是在代码执行期间而非编译期。:失去IDE对语法的验证

程序集的定义:.NET应用程序执行的最小单位例如.dll,.exe

优点
1、反射提高了程序的灵活性和扩展性。
2、降低耦合性,提高自适应能力。
3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。

缺点
1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。

猜你喜欢

转载自blog.csdn.net/weixin_44370124/article/details/90645493