C# 反射
反射(Reflection)是.NET中的重要机制,通过反射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象。
反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。
然后,可以调用类型的方法或访问其字段和属性。
反射用途
1.使用Assembly定义和加载程序集
2.使用Module了解包含模块的程序集以及模块中的类等
3.使用ConstructorInfo了解构造函数的名称、参数、访问修饰符
4.使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符
5.使用FieldInfo了解字段的名称、访问修饰符
6.使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等
7.使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取 或设置属性值
8.使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名 中的位置等
反射动态加载程序集
掌握如下类及方法
1.Assembly
2.Assembly.LoadFrom
3.Activator.CreateInstance
反射使用场景
1.有时不知道具体的类型,可以通过dll去得到类的对象
2.某些特殊方法,传过来的是泛型类,需要通过反射处理某些特殊的业务
3.通用方法DataTable和List<T>的相互转化时需要用到反射
反射优点
1.使用了反射后,你的程序在更新的时候无需重新编译,只要将更新的Dll换掉即可完成程序的更新 和升级。
2.将反射和配置文件相结合,可以开发出功能随意增删改的软件,具备了极大地灵活性和扩展性。
3.反射提高了程序的灵活性,降低了耦合性,提高了自适应能力,同时也大大提高了程序的复用性。
反射缺点
1.首先带来的一个很大的问题就是——性能问题,使用反射基本上是一种解释操作,用于字段和方法 接入时要远慢于直接代码。
2.使用反射会使程序内部逻辑模糊化,程序员在调试代码的时候希望看到清晰的程序逻辑,而反射却 绕过了源代码,因此会带来一定的维护性问题,同时反射代码比相应的直接代码更加复杂。
Name 数据类型名
FullName 数据类型的完全限定名(包括命名空间名)
Namespace 定义数据类型的命名空间名
IsAbstract 指示该类型是否是抽象类型
IsArray 指示该类型是否是数组
IsClass 指示该类型是否是类
IsEnum 指示该类型是否是枚举
IsInterface 指示该类型是否是接口
IsPublic 指示该类型是否是公有的
IsSealed 指示该类型是否是密封类
IsValueType 指示该类型是否是值类型