1.GetCustomAttributes() :获得与主调对象关联的自定义特性列表。
2.IsDefined(): 确定是否为主调对象定义了相应的特性。
3.GetCustomAttributesData():返回有关自定义特性的信息(特性稍后便会提到)
当然除了MemberInfo类定义的方法和属性外,Type类自己也添加了许多属性和方法:如下表(只列出一些常用的,太多了,自己可以转定义Type类看下)
Type类定义的方法 方法 功能 ConstructorInfo[] GetConstructors() 获取指定类型的构造函数列表 EventInfo[] GetEvents(); 获取指定类型的时间列 FieldInfo[] GetFields(); 获取指定类型的字段列 Type[] GetGenericArguments(); 获取与已构造的泛型类型绑定的类型参数列表,如果指定类型的泛型类型定义,则获得类型形参。对于正早构造的类型,该列表就可能同时包含类型实参和类型形参 MemberInfo[] GetMembers(); 获取指定类型的成员列表 MethodInfo[] GetMethods(); 获取指定类型的方法列表 PropertyInfo[] GetProperties(); 获取指定类型的属性列表
下面列出Type类定义的常用的只读属性
Type类定义的属性 属性 功能 Assembly Assembly 获取指定类型的程序集 TypeAttributes Attributes 获取制定类型的特性 Type BaseType 获取指定类型的直接基类型 String FullName 获取指定类型的全名 bool IsAbstract 如果指定类型是抽象类型,返回true bool IsClass 如果指定类型是类,返回true string Namespace 获取指定类型的命名空间
使用反射
上面的列术都是为了,这里的使用。
通过使用Type类定义的方法和属性,我们能够在运行时获得类型的各种具体信息。这是一个非常强大的功能。我们一旦得到类型信息,就可以调用其构造函数,方法,和属性。可见,反射是允许使用编译时不可用的代码的。
由于Reflection API非常多,这里不可能完整的介绍他们(这里如果完整的介绍,据说要一本书,厚书)。但是,Reflection API是按照一定逻辑设计的。因此,只要知道部分接口的使用方法,就可以举一反三的使用剩余的接口。
这里我列出四种关键的反射技术:
1.获取方法的信息
2.调用方法
3.构造对象
4.从程序集中加载类型
获取方法的相关信息
一旦有了Type对象就可以使用GetMethodInfo()方法获取此类型支持的方法列表。该方法返回一个MethodInfo 对象数组,MethodInfo对象描述了主调类型所支持的方法,他位于System.Reflection命名空间中
MethodInfo类派生于MethodBase抽象类,而MethodBase类继承了MemberInfo类。因此我们能够使用这三个类定义的属性和方法。例如,使用Name属性得到方法名称。这里有两个重要的成员:
1. ReturnType属性 :为Type类型的对象,能够提供方法的返回类型信息
2. GetParameters()方法 :返回参数列表,参数信息以数组形式保存在PatameterInfo对象中。PatameterInfo类定义了大量描述参数信息的属性和方法。这里也列出两个常用的属性 :Name(包含参数名称信息的字符串),ParameterType(参数类型的信息)。
下面代码,我将使用反射获得类中所支持的方法,还有方法的信息。
复制代码 代码如下:
View Code