System.Type类(转)
Type t = typeof(double)
我们以前把Type看作一个类,但它实际上是一个抽象的基类。只要实例化了一个Type对象,就实例化了Type的一个派生类。Type有与每种数据类型对应的派生类,但一般情况下派生的类只提供各种Type方法和属性的不同重载,返回对应数据类型的正确数据。一般不增加新的方法或属性。获取指向给定类型的Type引用有3种常用方式:
● 使用 C# typeof 运算符,如上所示。这个运算符的参数是类型的名称
● 使用 GetType()方法,所有的类都会从System.Object继承这个类。
double d = 10;
Type t = d.GetType();
在一个变量上调用GetType(),而不是把类型的名称作为其参数。但要注意,返回的Type对象仍只与该数据类型相关:它不包含与类型实例相关的任何信息。如果有一个对象引用,但不能确保该对象实际上是哪个类的实例,这个方法也是很有用的。
● 还可以调用Type类的静态方法GetType():
Type t = Type.GetType("System.Double");
Type是许多反射技术的入口。它实现许多方法和属性,这里不可能列出所有的方法和属性,而主要介绍如何使用这个类。注意,可用的属性都是只读的:可以使用Type确定数据的类型,但不能使用它修改该类型!1. Type的属性
由Type执行的属性可以分为下述3类:
● 有许多属性都可以获取包含与类相关的各种名称的字符串,如表10-1所示。
表 10-1
属 性 |
返 回 值 |
Name |
数据类型名 |
FullName |
数据类型的完全限定名(包括命名空间名) |
Namespace |
定义数据类型的命名空间名 |
● 属性还可以进一步获取Type对象的引用,这些引用表示相关的类,如表10-2所示。
表 10-2
属 性 |
返回对应的Type引用 |
BaseType |
这个Type的直接基本类型 |
UnderlyingSystemType |
这个Type在 .NET 运行库中映射的类型 (某些.NET基类实际上映射由IL识别的特定预定义类型) |
● 许多Boolean 属性表示这个类型是一个类、还是一个枚举等。这些属性包括IsAbstract、IsArray、IsClass、IsEnum、IsInterface、IsPointer、IsPrimitive(一种预定义的基本数据类型)、 IsPublic、IsSealed和IsValueType
例如,使用一个基本数据类型:
Type intType = typeof(int);
Console.WriteLine(intType.IsAbstract); // writes false
Console.WriteLine(intType.IsClass); // writes false
Console.WriteLine(intType.IsEnum); // writes false
Console.WriteLine(intType.IsPrimitive); // writes true
Console.WriteLine(intType.IsValueType); // writes true
或者使用Vector类:
Type intType = typeof(Vector);
Console.WriteLine(intType.IsAbstract); // writes false
Console.WriteLine(intType.IsClass); // writes true
Console.WriteLine(intType.IsEnum); // writes false
Console.WriteLine(intType.IsPrimitive); // writes false
Console.WriteLine(intType.IsValueType); // writes false
您也可以获取定义类型的程序集的引用,该引用作为System.Reflection.Assembly类实例的一个引用被返回:
Type t = typeof (Vector);
Assembly containingAssembly = new Assembly(t);
2. 方法
System.Type的大多数方法都用于获取对应数据类型的成员信息:构造函数、属性、方法和事件等。它有许多方法,但它们都有相同的模式。例如,有两个方法可以获取数据类型的方法信息:GetMethod() 和 GetMethods()。GetMethod()方法返回System.Reflection.MethodInfo对象的一个引用,其中包含一个方法的信息。GetMethods()返回这种引用的一个数组。其区别是GetMethods()返回所有方法的信息,而GetMethod()返回一个方法的信息,其中该方法包含特定的参数列表。这两个方法都有重载方法,该重载方法有一个附加的参数,BindingFlags枚举值,表示应返回哪些成员,例如,返回公有成员、实例成员和静态成员等。
例如,GetMethods()最简单的一个重载方法不带参数,返回数据类型所有公共方法的信息:
Type t = typeof(double);
MethodInfo [] methods = t.GetMethods();
foreach (MethodInfo nextMethod in methods)
{
// etc.
Type的成员方法如表10-3所示遵循同一个模式。
表 10-3
返回的对象类型 |
方法 (名称为复数形式的方法返回一个数组) |
ConstructorInfo |
GetConstructor(), GetConstructors() |
EventInfo |
GetEvent(), GetEvents() |
FieldInfo |
GetField(), GetFields() |
InterfaceInfo |
GetInterface(), GetInterfaces() |
MemberInfo |
GetMember(), GetMembers() |
MethodInfo |
GetMethod(), GetMethods() |
PropertyInfo |
GetProperty(), GetProperties() |
GetMember() 和 GetMembers()方法返回数据类型的一个或所有成员的信息,这些成员可以是构造函数、属性和方法等。最后要注意,可以调用这些成员,其方式是调用Type的InvokeMember()方法,或者调用MethodInfo, PropertyInfo和其他类的Invoke()方法。
posted on 2009-01-19 22:22 Zihuatanejo 阅读(2669) 评论(0) 收藏 举报