反射

什么是反射

可以动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。 然后,可以调用类型的方法或访问其字段和属性

C#中的反射

1.使用 Assembly 来定义和加载程序集,加载程序集清单中列出的模块,以及在此程序集中定位一个类型并创建一个它的实例。

  DLL是一种文件,是程序集的物理实现,程序集是组织程序的逻辑方法,类似函数库。一般我们可以认为托管的DLL和程序集是等同的。DLL分很多种,要看内部数据的表示方式。但是他的作用都差不多,也就是储存数据,当需要时才加载,从而加快程序启动,减少资源浪费。

2.使用 Module 发现信息,如包含模块的程序集和模块中的类。 还可以获取所有全局方法或模块上定义的其它特定的非全局方法。

  Module并不是C#的概念,而是微软的运行时环境CLR的概念,程序集由多个模块组成。程序集是一个或多个模块、资源文件的逻辑性分组,其次程序集是重用,安全性和版本控制的最小单元。CLR并不和Module模块一起工作,而是和程序集一起工作的。

3.使用 ConstructorInfo 发现信息,如名称、参数、访问修饰符(如 public 或 private)和构造函数的实现详细信息(如 abstract 或 virtual)。 使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定构造函数。

4.使用 MethodInfo 发现信息,如名称、返回类型、参数、访问修饰符(如 public 或 private)和方法的实现详细信息(如 abstract 或 virtual)。 使用 Type 的 GetMethods 或 GetMethod 方法来调用特定方法。

5.使用 FieldInfo 发现信息,如名称、访问修饰符(如 public 或 private)和一个字段的实现详细信息 (如 static);并获取或设置字段值。

6.使用 EventInfo 发现信息(如名称、事件处理程序的数据类型、自定义特性、声明类型以及事件的反射的类型),并添加或删除事件处理程序。

7.使用 PropertyInfo 发现信息(如名称、数据类型、声明类型,反射的类型和属性的只读或可写状态),并获取或设置属性值。

8.使用 ParameterInfo 发现信息,如参数的名称、数据类型、参数是输入参数还是输出参数以及参数在方法签名中的位置。

9.使用 CustomAttributeData 在于应用程序域的仅反射上下文中工作时发现有关自定义特性的信息。 CustomAttributeData 使你能够检查特性,而无需创建它们的实例。 System.Reflection.Emit 命名空间的类提供一种专用形式的反射,使你能够在运行时生成类型。

官方文档

反射的优点

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

反射的运用场景

1.在编译时根本无法知道该对象或类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息

2.用于系统架构设计

反射的问题

1.性能问题:反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码,因此反射机制主要应用于对灵活性和扩展性要求很高的系统框架上,主要偏向于系统底层设计

2.使用反射会模糊程序内部逻辑,程序员希望在代码中看到程序逻辑,反射则绕过了源代码的技术,因而会带来维护和调试的问题,反射的代码相比于直接代码要更加复杂

程序集是一个或多个模块、资源文件的逻辑性分组,其次程序集是重用,安全性和版本控制的最小单元

posted @ 2021-09-29 17:53  .NET_CJL  阅读(41)  评论(0)    收藏  举报