一、反射(Reflection)
1、什么是反射
- 是.NET Framework 的功能,并不是C#语言特有的功能
- 反射机制对应设计模式中的策略模式。
- 反射是System.Reflection命名空间,可以读取metadata,并使用metadata,是微软提供的一个帮助类,在各个场景中都会使用到,而其主要作用是“解耦”,降低对细节的依赖。
- 简单理解:
- 给我一个对象,我能在不用new操作符的情况下,也不知道是什么静态类型的情况下,创建一个同类型的对象
- 还能访问这个对象的各个成员
- 注意:
- 这相当于进一步解耦(如果用new操作符,意味着类型依赖)
- 反射是托管语言(C#,Java)和原生语言(C,C++)的最大区别之一
- 单元测试、依赖注入、泛型编程都是基于反射机制的
- 一般情况下,我们在使用反射时并不能感觉到,因为大多数我们使用的都是封装好的反射
2、为什么需要反射
- 原因:
- 很多时候程序的逻辑并不是在写的时候就能确定,有时需要用户交互时才确定
- 此时程序已经属于运行状态(Dynamic,动态)
- 如果要程序员在静态(static)编写时,去枚举用户可能做的操作,会让程序变得十分臃肿,可读性、可维护性都很烂,并且枚举用户可能做的操作这件事是很难实现的
- 这是我们需要的这种:以不变应万变的能力,就是反射机制
3、反射优缺点
- 优点
- 1、反射提高了程序的灵活性和扩展性。
- 2、降低耦合性,提高自适应能力。
- 3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
- 缺点
- 1、性能问题:反射是去内存中动态拿到对象/类型描述,再用这些描述去创建对象,这个过程是对性能有影响的(使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。)
- 2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。
4、常用使用方式
System.Reflection.Assembly ass = Assembly.LoadFrom(Server.MapPath("xx.dll")); //加载DLL
System.Type t = ass.GetType("x.Class");//获得类型
object o = System.Activator.CreateInstance(t);//创建实例
System.Reflection.MethodInfo mi = t.GetMethod("Run");//获得方法
mi.Invoke(o, new object[] { this.Page,"alert('测试')"});//调用方法
可以对程序集的类进行实例化,掉用类中的方法等,就跟我们普通使用程序集一样
反射机制通常有下面一些用途
- 使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。
- 使用 Module 发现以下信息:包含模块的程序集以及模块中的类等。 您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
- 使用 ConstructorInfo 发现以下信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。 使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。
- 使用 MethodInfo 发现以下信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。 使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。
- 使用 FieldInfo 发现以下信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如static)等;并获取或设置字段值。
- 使用 EventInfo 发现以下信息:事件的名称、事件处理程序数据类型、自定义特性、声明类型和反射类型等;并添加或移除事件处理程序。
- 使用 PropertyInfo 发现以下信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。
- 使用 ParameterInfo 发现以下信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。
- 当您在一个应用程序域的仅反射上下文中工作时,请使用 CustomAttributeData 来发现有关自定义特性的信息。 通过使用 CustomAttributeData,您不必创建特性的实例就可以检查它们。
关于反射,MSDN上有很详细的说明,这里不详细讲,下面简单说说反射的使用
本文详细介绍了C#中的反射机制,包括反射的概念、为何需要反射及其优缺点。通过实例展示了如何使用反射加载DLL、获取类型、创建实例以及调用方法。反射提供了解耦和动态操作对象的能力,但可能导致性能损失和程序逻辑复杂性增加。
1508

被折叠的 条评论
为什么被折叠?



