Type类
ns:System
Type类封装类型 它的实例提供一个特定类型的数据和函数成员的信息 可以使用Type类实例来调用类型的成员 一般将Type类用于反射
Type类的静态字段如下
EmptyTypes字段
只读 返回一个表示Type类型的空数组 如果你想检索某个类型中不带参数的构造函数 可以使用该字段 如
Type obj=Type.GetType("LearningCsharp.MyClass"); ConstructorInfo FunConstructor = obj.GetConstructor(Type.EmptyTypes);//参数Type.EmptyTypes表示空数组 即此方法将匹配无参数的实例构造函数
FilterAttribute字段
返回一个MemberFilter类型的委托实例 该委托可以与FindMembers方法一起使用 用于Type的实例方法FindMembers 此委托有两个参数 MemberInfo和Object Object是一个过滤标准 如果MemberInfo对象能匹配这些标准 则委托函数返回true 在这种情况下 对象可以是FieldAttribute、MethodAttribute或MethodImplAttribute枚举值中的一个 而且在成员与指定属性相关联时返回true
FilterName字段
返回一个MemberFilter类型的委托实例 该委托可以与FindMembers方法一起使用 在这种情况下 对象是一个字符串 如果成员名称匹配这个字符串 委托函数会返回true 字符串可以包含通配符*
FilterNameIgnoreCase字段
返回一个MemberFilter类型的委托实例 该委托可以与FindMembers方法一起使用 与FilterName字段的作用是相同的 除了匹配时是区分大小写的
Missing字段
表示一个未指定的值 主要用于反射 当利用反射来调用某个类型的函数时 使用此字段来表示未传递参数值 应该使用默认值
Type类的属性如下
Assembly属性
获取指定类型所在的程序集 返回一个表示程序集的Assembly对象 如
Type type= Type.GetType("LearningCsharp.MyClass"); Console.WriteLine(type.Assembly); //结果如下 LearningCsharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 请按任意键继续. . .
AssemblyQualifiedName属性
获取指定类型所在的程序集的完全限定名 返回一个字符串 如
Type obj = Type.GetType("LearningCsharp.MyClass"); Console.WriteLine(obj.AssemblyQualifiedName); //结果 LearningCsharp.MyClass, LearningCsharp, Version=1.0.0.0, Culture=neutral, Public KeyToken=null
Attributes属性
获取与Type相关联的属性
BaseType属性
获取当前类型的基类 返回一个Type类实例 如果当前类型直接是Object 则返回null
DeclaringType属性
如果当前的类型是嵌套类型 则返回表示封闭类型的 Type 对象 如果当前的类型是泛型类型或泛型类型的类型参数 则返回泛型类型的定义 如果当前的类型是泛型方法的类型参数 则返回用来声明泛型方法的类型 否则返回Nothing
DefaultBinder静态属性
返回系统使用的默认绑定程序
FullName属性
获取当前类型所在的命名空间的完全限定名 但不包括程序集名称
HasElementType
获取一个值 通过该值指示当前 System.Type 是包含还是引用另一类型 即当前 System.Type 是数组、指针还是通过引用传递
MemberType属性
返回一个System.Reflection.MemberTypes枚举值 该枚举值用以描述一个成员的类型 可能返回的枚举值有All(所有成员)、Constructor(构造函数)、Custom(定制的成员)、Event(事件)、Field(字段)、Method(方法)、NestedType(嵌套类型)、Property(属性)、TypeInfo(类型)
Module属性
获取当前类型所在的模块
Namespace属性
获取当前类型所在的命名空间
ReflectedType属性
与反射一起使用 通过此属性获得MemberInfo对象的Type
TypeHandle属性
返回当前Type实例的句柄 这是一个指向内部结构的指针 用来表示类型 还可以把它传递给静态方法Type.GetTypeFromHandle来检索相应的Type对象
TypeInitializer属性
用于检索代表当前Type静态构造函数的ConstructorInfo对象 静态构造函数在IL中被称为".cctor" 这也将作为ConstructorInfo对象的名称
UnderlyingSystemType属性
返回当前类型的底层CLR系统类型
Type类的静态方法如下
GetType静态方法
根据指定的名称返回一个Type实例
Console.WriteLine(Type.GetType("LearningCsharp.MyClass"));//return LearningCsharp.MyClass
如果程序集是共享的 还需要提供版本和文化信息以及公共密匙代码(可以在全局程序集缓存中找到)Type派生自Object 它是一个抽象类 而Object也提供GetType方法 这意味着你可以在任何类型上调用GetType
Type.GetType("Microsoft.Data.OdbcConnection,Microsoft.Data.Odbc,Version=1.0.3300.0,Culture=neutral,PublickeyToken=b77a5c561934e089");
GetTypeArray静态方法
根据指定的args参数获取某个数组里的元素类型 返回一个存储每个元素类型的Type[]数组对象 args表示的是一个object[]数组类型的对象 如
, "leo" }; Type[] typeArray = Type.GetTypeArray(objArray); foreach (var item in typeArray) { Console.WriteLine(item.Name);//return String Int String }
GetTypeCode静态方法
获取指定类型的底层代码类型 返回一个TypeCode枚举 可能返回的枚举值有Boolean、Byte、SByte、Char、Decimal、Double、Single、Int32、UInt32、Int64、UInt64、Object、Int16、UInt16、String
GetTypeFromCLSID静态方法
根据指定的类标识符(CLSID)返回一个Type实例
GetTypeFromProgID静态方法
根据指定的程序标识符(ProgID)返回一个Type实例
GetTypeFromHandle静态方法
根据指定类型句柄创建并返回一个Type引用
GetTypeHandle静态方法
为指定对象的Type返回句柄(一个代表类型的内部结构指针)
Type类的实例方法如下
Equals方法
测试当前对象与参数指定的对象的类型是否引用自托管堆中的同一个地址 与==作用是相同的
GetHashCode方法
获取Type对象的散列码
FindInterfaces方法
接收一个TypeFilter类型的委托实例和一个Object类型的表示查找标准的对象作为参数 该方法通过使用TypeFilter委托函数以查找标准的对象为准则对当前类型所实现或继承的接口进行过滤 返回一个Type[]数组 该数组存储符合查找标准的接口类型
FindMembers方法
接受一个MemberFilter类型的委托实例和一个Object类型的表示查找标准的对象作为参数 还接收一个BindingFlags枚举 该枚举用于指定过滤应该如何实施 该方法通过使用MemberFilter委托函数以查找标准的对象为准则对当前类型的成员实施过滤 返回一个MemberInfo类型的数组 该数组存储当前类型的成员类型
GetDefaultMembers方法
过滤当前类型的成员中 应用了System.Reflection.DefaultMemberAttribute特性的成员 返回一个MemberInfo类型的数组 该数组存储的就是过滤后的成员类型
GetArrayRank方法
获取当前类型(多维数组类型)的维度
GetAttributeFlagsImpl抽象方法
此方法是抽象的 只能在Type的派生类中实现 必须返回一个TypeAttributes枚举值 这些枚举值包含了类型的详细信息 诸如访问权限级别、是否是抽象或密封的 是否可以序列化
GetElementType方法
返回对象的类型 或与一个数组、指针或引用类型相关联的对象的类型
,,}; Type type=Array.GetType(); Console.WriteLine(type.GetElementType());//return System.Int32
GetConstructor方法
查找当前类型的构造函数 返回一个System.Reflection.ConstructorInfo对象 该对象表示构造函数 所有参数介绍如下
bindingAttr:一个BindingFlags类型的对象 用于指定查找应该如何进行 默认情况下会查找当前类型的所有公有的实例构造函数 通过此参数可以改变这种默认行为
binder:一个Binder对象 此对象定义了启动绑定的属性 此参数可以为null 当为null时 会启用默认的绑定程序
types:一个Type类型的数组 GetConstructor方法会检索当前类型的所有构造函数的参数是否与types指定的数组的代表参数的元素匹配 筛选出匹配的构造函数
Type obj=Type.GetType("LearningCsharp.MyClass"); ConstructorInfo FunConstructor = obj.GetConstructor(Type.EmptyTypes);//参数Type.EmptyTypes表示空数组 即此方法将匹配无参数的实例构造函数
GetConstructors方法
返回一个System.Reflection.ConstructorInfo类型的数组对象 该对象表示构造函数列表 默认获取的是所有的公有实例构造函数 可以通过参数bindingAttr边改这种默认行为
GetField方法
获取当前类型中匹配name参数指定的字段成员 它的参数如下
name:字段的名称
bindingAttr:一个BindingFlags类型的对象 用于指定查找应该如何进行 比如指定只查找静态字段或只查找实例字段等等 默认查找的是公有的字段
GetFields方法
使用bindingAttr指定查找应该如何进行 默认查找的是所有公有的字段 返回一个FieldInfo类型的数组 存储了所有的字段列表
GetInterface方法
获取当前类型中匹配name参数指定的它所实现的或继承的接口 未找到则会返回null 它参数如下
name:接口的名称
ignoreCase:一个bool值 指定查找的接口名称是否不区分大小写 默认值为false表示区分大小写
GetInterfaces方法
获取当前类型实现的或继承的所有接口 返回一个Type类型的数组 存储了接口类型列表
GetInterfaceMap方法
返回指定接口类型的接口映射 接口映射表示接口是如何被映射到实现该接口的类上的实际方法 返回一个System.Reflection.InterfaceMapping对象 该对象就表示接口映射 它提供接口定义的方法的信息 以及关于这些方法在当前类型中的实现的信息
GetEvent方法
获取当前类型中匹配name参数指定的它所发布的事件委托 返回一个EventInfo对象 它的参数如下
name:事件委托的名称
bindingAttr:一个BindingFlags类型的对象 用于指定查找应该如何进行 默认查找的是公有的事件委托
GetEvents方法
使用bindingAttr指定查找应该如何进行 默认查找的是所有公有的事件委托 返回一个EventInfo类型的数组 存储了所有的事件列表
GetMember方法
获取当前类型中匹配name参数指定的成员 返回一个MemberInfo类型的数组 此方法因为查找的是成员 而成员方法可能具有重载 所以返回的是数组而非单个MemberInfo 它的参数如下
name:成员的名称
bindingAttr:一个BindingFlags类型的对象 用于指定查找应该如何进行 默认查找的是公有的成员
type:一个System.Reflection.MemberTypes枚举 该枚举提供了多个枚举值用以表示成员的类型 可能的枚举值有All(所有成员)、Constructor(构造函数)、Custom(定制的成员)、Event(事件)、Field(字段)、Method(方法)、NestedType(嵌套类型)、Property(属性)、TypeInfo(类型) 提供此参数 则表示需要按照提供的成员类型来查找与此类型匹配的成员 默认值为MemberTypes.All
GetMembers方法
获取当前类型的所有成员 可以使用参数bindingAttr指定查找应该如何进行 默认获取的是所有的公共成员 返回一个MemberInfo类型的数组
GetMethod
获取当前类型中匹配name参数指定的方法成员 返回一个MethodInfo对象 表示成员方法 此方法具有多个重载 它的参数如下
name:方法的名称
bindingAttr:一个BindingFlags类型的对象 用于指定查找应该如何进行 默认查找的是公有的实例方法
types:一个Type类型的数组 存储方法接收的参数类型(仅按引用传递的参数类型)此参数只在方法通过COM互操作性被调用时使用
modifiers:一个ParameterModifiers类型的数组 存储方法的修饰符 GetMethod将查找匹配的修饰符的方法
binder:提供绑定 可以为null 如果为null 将使用默认绑定程序
convention:一个CallingConvention枚举 指定了参数如何被显示和使用
GetMethodImpl
此方法需要提供name、bindingAttr、types、binder和convention 同样是查找当前类型的方法成员 返回一个MethodInfo对象 表示方法成员
GetMethods
获取当前类型的所有方法成员 默认获取的是所有公有的实例方法 可以通过bindingAttr改变默认的行为 返回一个MethodInfo类型的数组 存储方法成员
GetNestedType
获取当前泛型类型中包含的匹配name参数指定的类型 返回一个Type 表示泛型包含的类型 它的参数如下
name:泛型所包含的类型的名称
bindingAttr:一个BindingFlags类型的对象 用于指定查找应该如何进行
GetNestedTypes
获取当前泛型类型中包含所有类型 返回一个Type类型的数组 存储泛型包含的所有类型
GetProperty
获取当前类型中包含的匹配name参数指定的属性成员 返回一个PropertyInfo表示属性 此方法具有多个重载 它的参数如下
name:属性的名称
bindingAttr:一个BindingFlags类型的对象 用于指定查找应该如何进行 默认查找的是公有的实例属性
returnType:属性的返回类型
types:一个Type类型的数组 存储属性的参数类型(仅按引用传递的参数类型)??
modifiers:一个ParameterModifiers类型的数组 存储属性的修饰符 GetProperty将查找匹配的修饰符的属性
binder:提供绑定 可以为null 如果为null 将使用默认绑定程序
GetPropertyImpl
此方法需要提供name、bindingAttr、returnType、binder和types 同样是查找当前类型的属性成员 返回一个PropertyInfo对象 表示属性
GetProperties
获取当前类型的所有属性成员 默认获取的是所有公有的实例属性成员 可以通过bindingAttr改变默认的行为 返回一个PropertyInfo类型的数组 存储属性成员
IsInstanceOfType
如果当前类型是参数对象本来的类型或继承的类型 返回true
如果当前接口类型是参数对象实现的或继承的接口 返回true
public interface myinterface { } public class BaseClass : myinterface { } static void Main(string[] args) { BaseClass obj = new BaseClass(); Type type = Type.GetType("LearningCsharp.myinterface"); bool bol = type.IsInstanceOfType(obj); Console.WriteLine(bol);//return true }
IsSubclassOf
如果当前类型是参数对象所继承的或间接继承的类型 返回true
public class BaseClass { } public class childClass :BaseClass { } static void Main(string[] args) { BaseClass obj = new BaseClass(); Type type = Type.GetType("LearningCsharp.childClass"); bool bol = type.IsSubclassOf(obj.GetType());//childClass继承自BaseClass Console.WriteLine(bol);//return true }
利用反射获取DateTime类型的公有静态属性的简单例子
static void Main(string[] args) { string typeName = "System.DateTime"; Type t = Type.GetType(typeName); MemberInfo[] members = t.FindMembers(MemberTypes.Property, BindingFlags.Static | BindingFlags.Public, Type.FilterName, "*"); Console.WriteLine("{0}的所有公共静态属性如下\n",t.Name); foreach (MemberInfo item in members) { PropertyInfo property = (PropertyInfo)item; Console.WriteLine("{0}.{1}=>value=>{2}",property.PropertyType,property.Name,property.GetValue(null)); } }
FindMembers方法的第二个参数表示查找行为 该参数使用了 | 运算符 专门查找公有静态成员 第三个参数是一个委托 它表示区分成员名称大小写的筛选器 最后一个参数是一个object对象 表示查找判据 这里使用*号表示查找所有符合标准的成员 最后我们通过PropertyInfo的GetValue方法获得了属性值 该方法传递了一个null的对象是因为我们获取的是静态属性 不需要对象调用属性