System.Type.GetType 方法 (String, Boolean)
方法描述
获取具有指定名称的 Type,同时执行大小写敏感的搜索,并指定是否在没有找到该类型时引发异常。
语法定义(C# System.Type.GetType 方法 (String, Boolean) 的用法)
public static Type GetType( string typeName, bool throwOnError )
参数/返回值
参数值/返回值 | 参数类型/返回类型 | 参数描述/返回描述 |
---|---|---|
typeName | System-String | 要获取的类型的程序集限定名称。请参见 AssemblyQualifiedName。如果该类型位于当前正在执行的程序集中或者 Mscorlib.dll 中,则提供由命名空间限定的类型名称就足够了。 |
throwOnError | System-Boolean | 如果为 true,则在找不到该类型时引发异常;如果为 false,则返回 null。指定 false 还会消除其他一些异常情况,但不能全部消除。请参见“异常”一节。 |
返回值 | System.Type | 具有指定名称的类型。 如果未找到该类型,则 throwOnError 参数指定是返回 null 还是引发异常。 某些情况下,无论 throwOnError 的值是什么,都会引发异常。 请参见“异常”一节。 |
提示和注释
您可以使用 GetType 方法来获取另一个程序集中某个类型的 Type 对象(如果您知道该程序集的命名空间限定名称)。 GetType 导致加载 typeName 中指定的程序集。 您还可以使用 Load 方法来加载程序集,然后使用 Assembly 类的 GetType 或 GetTypes 方法来获取 Type 对象。 如果在编译时,程序集中的类型对于您的程序来说是已知的,则使用 typeof(在 C# 中)、GetType(在 Visual Basic 中)或 typeid(在 C++ 中)更为高效。
GetType 仅适用于从磁盘加载的程序集。 如果调用 GetType 来查找在用 System.Reflection.Emit 服务定义的动态程序集中定义的类型,则可能会获得不一致的行为。 该行为取决于动态程序集是否持久,即是否是使用 System.Reflection.Emit.AssemblyBuilderAccess 枚举的 RunAndSave 或 Save 访问模式创建的。 如果动态程序集持久并已在调用 GetType 之前写入磁盘,则加载器会在磁盘上查找已保存的程序集,加载该程序集并从该程序集中检索类型。 如果在调用 GetType 时尚未将程序集保存到磁盘,该方法将返回 null。 GetType 不能识别瞬态动态程序集;因此,通过调用 GetType 来检索瞬态动态程序集中的类型会返回 null。
若要对动态模块使用 GetType,请在保存之前预订 AppDomain.AssemblyResolve 事件并调用 GetType。 否则,将获得内存中程序集的两个副本。
throwOnError 参数指定当找不到该类型时发生的事件,还取消某些其他异常条件(如"异常"部分所述)。 将引发某些异常,而不考虑 throwOnError 的值。 例如,如果找到但无法加载此类型,则即使 throwOnError 为 false,也会引发 TypeLoadException。
下表显示在某个类型上进行反射时,Get 方法返回的基类的成员。
成员类型
Static
非静态
构造函数
否
否
字段
否
是。 字段总是按名称和签名隐藏。
Event
不适用
常规类型系统规则是:该继承与实现属性的方法的继承相同。 反射将属性视为按名称和签名隐藏。 请参见下面的“注意 2”。
方法
否
是。 方法(虚方法和非虚方法)可按名称隐藏或按名称和签名隐藏。
嵌套类型
否
否
Property
不适用
常规类型系统规则是:该继承与实现属性的方法的继承相同。 反射将属性视为按名称和签名隐藏。 请参见下面的“注意 2”。
按名称和签名隐藏会考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、标记和非托管调用约定。 这是二进制比较。
对于反射,属性和事件按名称和签名隐藏。 如果基类中有同时带 get 访问器和 set 访问器的属性,但派生类中仅有 get 访问器,则派生类属性隐藏基类属性,并且您将无法访问基类的设置程序。
自定义特性不是常规类型系统的组成部分。
不对数组或 COM 类型执行搜索,除非已将它们加载到可用类表中。
typeName 可以是由命名空间限定的类型名称,也可以是包含程序集名称规范的程序集限定名称。 请参见AssemblyQualifiedName。
如果 typeName 包含命名空间,而不包含程序集名称,则此方法将只是以该顺序搜索调用对象的程序集以及 Mscorlib.dll。 如果 typeName 是用部分或完整的程序集名称完全限定的,则此方法将在指定的程序集中进行搜索。 如果程序集具有强名称,则需要完整的程序集名称。
AssemblyQualifiedName 属性返回完全限定的类型名称(包括嵌套类型、程序集名称和泛型参数)。 所有支持公共语言运行时的编译器将发出嵌套类的简单名称,并且当被查询时,反射将依照下列约定构造一个 mangled 名称。
注意
在 .NET Framework 2.0 版中,已将处理器架构添加到程序集标识中,并可将其指定为程序集名称字符串的一部分。 例如,“ProcessorArchitecture=msil”。 但是,出于兼容方面的考虑,并未将它包括在由 AssemblyQualifiedName 属性返回的字符串中。 还可以通过创建 AssemblyName 对象并将其传递到 Load 方法的相应重载来加载类型。 然后就可以使用 Assembly.GetType 方法来从程序集加载类型。 另请参见AssemblyName.ProcessorArchitecture。
分隔符
含义
反斜杠 (\)
转义符。
反引号 (`)
位于泛型类型名称末尾处的一个或多个数字之前,这些数字表示类型参数的数目。
中括号 ([])
将已构造泛型类型的泛型类型参数列表括在括号内;在类型参数列表内,将程序集限定类型括在括号内。
逗号 (,)
位于程序集名称前。
句点 (.)
表示命名空间标识符。
加号 (+)
位于嵌套类前。
例如,类的完全限定名可能类似于如下形式:
复制
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
如果命名空间为 TopNamespace.Sub+Namespace,则该字符串就必须在加号 (+) 前加转义符 (\),以防止将加号解释成嵌套分隔符。 反射按如下形式发出该字符串:
复制
TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly
“++”变成“\+\+”,而“\”变成“\\”。
可以保持此限定名并在以后使用它来加载 Type。 若要搜索并加载 Type,请在使用 GetType 时仅使用类型名称或使用程序集限定的类型名称。 只结合类型名时,GetType 将只在调用方的程序集中查找 Type,然后再在系统程序集中查找。 结合程序集限定类型名时,GetType 将在所有程序集中查找 Type。
类型名可能包含尾部字符,尾部字符表示有关该类型的附加信息,如类型是引用类型、指针类型还是数组类型。 若要检索不具有这些尾随字符的类型名称,请使用 t.GetElementType().ToString(),其中 t 为类型。
在除程序集名称之外的所有类型名称组成部分中,空格都相关。 在程序集名称中,“,”分隔符之前的空格相关,但“,”分隔符之后的空格将被忽略。
泛型类型的名称以反引号 (`) 结尾,后跟表示泛型类型参数数目的数字。 之所以进行这样的名称重整,是为了允许编译器支持出现在同一范围内名称相同但类型参数数目不同的泛型类型。 例如,反射功能从泛型方法 Tuple(Of T) 和 Tuple(Of T0, T1)(在 Visual Basic 中)或 Tuple
对于泛型类型,类型参数列表括在中括号内,类型参数之间用逗号隔开。 例如,泛型 Dictionary
复制
System.Collections.Generic.Dictionary`2[System.String,MyType]
若要在类型参数列表中指定程序集限定类型,请将程序集限定类型括在中括号内。 否则,分隔程序集限定名称的逗号将被解释为限制其他类型参数。 例如,可以按如下方式指定 MyAssembly.dll 中 MyType 的 Dictionary
复制
Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
注意
只有当程序集限定类型出现在类型参数列表中时,才可以将它括在中括号内。 在程序集中搜索类型参数列表中限定类型和非限定类型的规则与搜索限定非通用类型和非限定非通用类型的规则相同。
可以为 Null 的类型是泛型类型的特例。 例如,可为 Null 的 Int32 由字符串“System.Nullable`1[System.Int32]”表示。
注意
在 C#、C++ 和 Visual Basic 中,还可以使用类型运算符来获取可以为 Null 的类型。 例如,可为 Null 的 Boolean 类型由 typeof(Nullable
下表显示用于各种类型的 GetType 的语法。
若要获取
使用
可为 Null 的 Int32
Type.GetType("System.Nullable`1[System.Int32]")
指向 MyType 的非托管指针
Type.GetType("MyType*")
指向 MyType 指针的非托管指针
Type.GetType("MyType**")
指向 MyType 的托管指针或引用
Type.GetType("MyType&"). 请注意,与指针不同,引用仅限于一个级别。
父类和嵌套类
Type.GetType("MyParentClass+MyNestedClass")
下限为 0 的一维数组
Type.GetType("MyArray[]")
下限未知的一维数组
Type.GetType("MyArray[*]")
n 维数组
逗号 (,) 在中括号中一共出现 n-1 次。 例如,System.Object[,,] 表示一个三维 Object 数组。
二维数组的数组
Type.GetType("MyArray[][]")
下限未知的矩形二维数组
Type.GetType("MyArray[,]")
具有一个类型参数的泛型类型
Type.GetType("MyGenericType`1[MyType]")
具有两个类型参数的泛型类型
Type.GetType("MyGenericType`2[MyType,AnotherType]")
具有两个程序集限定类型参数的泛型类型
Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]")
具有程序集限定类型参数的程序集限定泛型类型
Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly")
一个泛型类型,其类型参数是具有两个类型参数的泛型类型
Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]")
System.Type.GetType 方法 (String, Boolean)例子
如果类型对象引用的程序集不存在,则此示例引发一个异常。
using System; namespace MyTypeNameSpace { class MyClass { public static void Main(string[] arg) { try { // Get the type of a specified class. Type myType1 = Type.GetType("System.Int32"); Console.WriteLine("The full name is {0}.", myType1.FullName); // Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException. Type myType2 = Type.GetType("NoneSuch", true); Console.WriteLine("The full name is {0}.", myType2.FullName); } catch(TypeLoadException e) { Console.WriteLine(e.Message); } catch(Exception e) { Console.WriteLine(e.Message); } } } }
异常
异常 | 异常描述 |
---|---|
ArgumentNullException | typeName 为 null。 |
TargetInvocationException | 调用类初始值设定项并引发异常。 |
TypeLoadException |
|
ArgumentException |
|
FileNotFoundException | throwOnError 为 true,并且未找到该程序集或其依赖项之一。 |
FileLoadException | 找到了该程序集或它的某个依赖项,但未能加载。 |
BadImageFormatException |
|
版本信息
.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1 受以下版本支持:
适用平台
Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。