本文摘要
1、反射基础概念 |
2、反射的一般用途 |
3、反射的前期准备与铺垫:类型信息Type |
4、反射代码示例-实际应用 |
一、基础概念
反射提供了描述程序集、模块和类型的对象,可以使用反射动态创建类型的实例,将类型绑定到现有的对象,或者从现有的对象获取类型并调用其方法或者访问其字段和属性。
二、反射的一般用途
1、.使用Assembly定义和加载程序集,加载程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。
2、使用Module发现以下信息:包含模块的程序集以及模块中的类等,获取在模块上定义的全局方法或者其他特定的非全局方法。
3、使用ConstructorInfo发现:构造函数的名称、参数、参数访问符和实现详细信息,使用Type的GetConstructors或者GetConstructor方法来调用特定的构造函数。
4、使用MethodInfo发现:方法的名称、参数、返回类型、访问修饰符和实现信息,使用Type的GetMethods或者GetMethod方法调用特定的方法。
5、使用FieldInfo发现:字段的名称、访问修饰符、和实现详细信息,并获取或者设置字段的值。
6、使用EventInfo发现:事件的名称、事件处理程序的数据类型、自定义属性、声明类型和反射类型,添加或者移除事件处理程序。
7、使用PropertyInfo发现:属性的名称、数据类型、声明类型、反射类型和只读或者可写状态信息,并获取或者设置属性值。
8、使用ParameterInfo发现:参数的名称、数据类型、声明类型、反射类型或者是输入参数还是输出参数,以及参数在方法签名中的位置。
9、获取自定义Attribute节点的信息
三、反射的前期准备与铺垫:类型信息Type
System.Type类对于反射起着非常核心的作用。当反射请求加载的类型时,公共语言运行库将自动创建一个Type,我们就是用Type对象的方法、字段、属性和嵌套类来查找该类型的所有信息。
Type类表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义以及开放或者封闭构造的泛型类型。
Type是System.Reflection功能的根,也是访问元数据的主要方式。
获得某种类型关联的Type对象的方式:
辅助类:
using System; using System.Reflection; namespace CSharp.ReflectionDemo { public interface ICustonType { void TestMethod(); } public class CustomType : ICustonType { public void TestMethod() { throw new NotImplementedException(); } } class Program { static void Main(string[] args) { } } }
1、.NET所有的对象都继承与System.Object,通过公共方法GetType获取当前实例的Type
CustomType customType=new CustomType(); Type type = customType.GetType(); Console.WriteLine(type.FullName);
2、静态 GetType 方法返回 Type 对象,该对象表示由其完全限定名指定的类型。
Type type2 = Type.GetType("CSharp.ReflectionDemo.CustomType"); Console.WriteLine(type2.FullName);
3、Module.GetTypes、Module.GetType 和 Module.FindTypes方法返回 Type 对象
Module module = typeof (CustomType).Module; Type type3 = module.GetType(); Console.WriteLine(type3.FullName); Type[] types4 = module.GetTypes(); foreach (Type temp in types4) { Console.WriteLine(temp.FullName); }
4、FindInterfaces
5、GetElementType
Type type5 = customType.GetType(); Type type6 = type5.GetElementType();
6、GetInterfaces 和 GetInterface
Type type7 = type5.GetInterface("ICustonType"); Type[] types8 = type5.GetInterfaces(); foreach (Type temp2 in types8) { Console.WriteLine(temp2.FullName); } Console.WriteLine(type7.FullName);
7、GetTypeArray:获取指定数组中Type类型
object[] myobject=new object[3]; myobject[0] = 68; myobject[1] = "M9"; myobject[2] = new CustomType(); Type[] types9 = Type.GetTypeArray(myobject); foreach (Type temp in types9) { Console.WriteLine(temp.FullName); }
8、typeof运算符
Type type10 = typeof (CustomType); Console.WriteLine(type10.FullName);
四、反射代码示例-实际应用
示例一:抽象工厂
示例二: