System.Type.GetType 方法 (String, Func, Func, Boolean, Boolean)

方法描述

获取具有指定名称的类型,指定是否执行区分大小写的搜索,在找不到类型时是否引发异常,(可选)提供自定义方法以解析程序集和该类型。

语法定义(C# System.Type.GetType 方法 (String, Func, Func, Boolean, Boolean) 的用法)

public static Type GetType(
	string typeName,
	Func assemblyResolver,
	Func typeResolver,
	bool throwOnError,
	bool ignoreCase
)

参数/返回值

参数值/返回值 参数类型/返回类型 参数描述/返回描述
typeName System-String 要获取的类型的名称。如果提供了 typeResolver 参数,则类型名称可以为 typeResolver 能够解析的任何字符串。如果提供了 assemblyResolver 参数,或者使用了标准类型解析,则除非该类型位于当前正在执行的程序集或 Mscorlib.dll 中(在这种情况下足以提供其命名空间所限定的类型名称),否则 typeName 必须为程序集限定的名称(请参见 AssemblyQualifiedName)。
assemblyResolver System-Func 一个方法,它定位并返回 typeName 中指定的程序集。以 AssemblyName 对象形式传递给 assemblyResolver 的程序集名称。如果 typeName 不包含程序集的名称,则不调用 assemblyResolver。如果未提供 assemblyResolver,则执行标准程序集解析。警告 不要通过未知的或不受信任的调用方传递方法。此操作可能会导致恶意代码特权提升。仅使用您提供或者熟悉的方法。
typeResolver System-Func 一个方法,它在由 assemblyResolver 或标准程序集解析返回的程序集中定位并返回 typeName 所指定的类型。如果未提供任何程序集,则该方法可以提供一个程序集。该方法还采用一个参数以指定是否执行不区分大小写的搜索;ignoreCase 的值传递给该参数。警告 不要通过未知的或不受信任的调用方传递方法。
throwOnError System-Boolean 如果为 true,则在找不到该类型时引发异常;如果为 false,则返回 null。指定 false 还会消除其他一些异常情况,但不能全部消除。请参见“异常”一节。
ignoreCase System-Boolean 为 typeName 执行的搜索不区分大小写则为 true,为 typeName 执行的搜索区分大小写则为 false。
返回值 System.Type 具有指定名称的类型。 如果未找到该类型,则 throwOnError 参数指定是返回 null 还是引发异常。 某些情况下,无论 throwOnError 的值是什么,都会引发异常。 请参见“异常”一节。

提示和注释

使用此方法重载及其关联的重载(GetType(String, Func, Func) 和 GetType(String, Func, Func, Boolean))将 GetType 方法的默认实现替换为更灵活的实现。 通过提供自己的方法来解析类型名以及包含这些类型名的程序集的名称,您可以执行下列操作:

控制从中加载类型的程序集的版本。

提供了另一个位置来查找不包含程序集名称的类型名称。

使用部分程序集名称加载程序集。

返回不由公共语言运行时 (CLR) 创建的 System.Type 的子类。

例如,在版本容错序列化中,此方法使您可以使用部分名称搜索“最佳”程序集。 GetType 方法的其他重载需要程序集限定类型名称,包括版本号。

类型系统的替代实现可能需要返回不是由 CLR 创建的 System.Type 的子类;由 GetType 方法的其他重载返回的所有类型都是运行时类型。

用法说明

此方法重载及其关联的重载将 typeName 分析成某种类型的名称和程序集的名称,然后解析该名称。 程序集名称的解析在类型名称解析之间进行,这是因为类型名称必须在程序集的上下文中解析。

注意

如果您不熟悉程序集限定类型名称的概念,请参阅 AssemblyQualifiedName 属性。

如果 typeName 不是程序集限定名称,则跳过程序集解析。 非限定类型名称可以在 Mscorlib.dll 或当前执行的程序集的上下文中加以解析,或者您可以选择在 typeResolver 参数中提供程序集。 包含或忽略不同种类的名称解析的程序集名称的效果将显示为混合名称解析部分中的表。

常规用法注释:

请不要将方法传递到 assemblyResolver 或 typeResolver(如果他们来自未知或不受信任的调用方)。 仅使用您提供或者熟悉的方法。

警告

使用来自未知或不受信任的调用方的方法可能会导致恶意代码的特权提升。

如果忽略 assemblyResolver 和/或 typeResolver 参数,则 throwOnError 参数的值传递给执行默认解析的方法。

如果 throwOnError 为 true,当 typeResolver 返回 null 时,此方法引发 TypeLoadException,当 assemblyResolver 返回 null 时则引发 FileNotFoundException。

此方法不会捕捉 assemblyResolver 和 typeResolver 引发的异常。 您负责处理解析程序方法引发的任何异常。

解析程序集

assemblyResolver 方法接收一个通过分析 AssemblyName 中包含的字符串程序集名称而生成的 typeName 对象。 如果 typeName 不包含程序集名称,则不调用 assemblyResolver,且 null 传递给 typeResolver。

如果未提供 assemblyResolver,则使用标准程序集探测来定位程序集。 如果提供了 assemblyResolver,则 GetType 方法不执行标准探测;在这种情况下,您必须确保您 assemblyResolver 可以处理您传递给它的所有程序集。

如果无法分析程序集,assemblyResolver 方法将返回 null。 如果 assemblyResolver 返回 null,则不调用 typeResolver 且不发生进一步处理;另外,如果 throwOnError 为 true,则引发 FileNotFoundException。

如果传递给 assemblyResolver 的 AssemblyName 是部分名称,则其一个或多个部分为 null。 例如,如果没有版本,则 Version 属性为 null。 如果 Version 属性、CultureInfo 属性和 GetPublicKeyToken 方法都返回 null,则仅提供程序集的简单名称。 assemblyResolver 方法可以使用或忽略程序集名称的所有部分。

对于简单和程序集限定类型名称,不同的程序集解析选项的效果将显示为混合名称解析部分中的表。

解析类型

如果 typeName 未指定程序集名称,则始终调用 typeResolver。 如果 typeName 指定了程序集名称,则仅当成功解析该程序集名称时才调用 typeResolver。 如果 assemblyResolver 或标准程序集探测返回 null,则不调用 typeResolver。

typeResolver 方法接收三个参数:

如果 typeName 不包含程序集名称,则是要搜索的程序集或 null。

类型的简单名称。 在嵌套类型的情况下,这是最外层的包含类型。 在泛型类型的情况下,这是泛型类型的简单名称。

一个布尔值,在忽略类型名称时值为 true。

实现确定这些参数的使用方式。 typeResolver 方法应返回 null(如果它不能解析类型)。 如果 typeResolver 返回 null 且 throwOnError 为 true,则 GetType 的此重载引发 TypeLoadException。

对于简单和程序集限定类型名称,不同的类型解析选项的效果将显示为混合名称解析部分中的表。

解析嵌套类型

如果 typeName 是嵌套的类型,则只有最外面的包含类型的名称将传递到 typeResolver。 当 typeResolver 返回此类型时,将按递归方式调用 GetNestedType 方法,直到解析完最里面的嵌套类型。

解析泛型类型

GetType 被递归调用来解析泛型类型:先解析泛型类型本身,然后解析其类型参数。 如果类型参数是泛型参数,则递归调用 GetType 以解析其类型参数,依次类推。

assemblyResolver 和您提供的 typeResolver 的组合必须能够求解此递归的所有级别。 例如,假设您提供一个控制 MyAssembly 加载的 assemblyResolver。 假定您希望解析泛型类型 Dictionary(Visual Basic 中的Dictionary(Of String, MyType))。 您可以传递下面的泛型类型名称:

复制

"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"

请注意 MyType 是程序集限定的唯一类型参数。 Dictionary 和 String 类的名称不是程序集限定名。 您的 typeResolver 必须能够处理程序集或 null,因为它将为 Dictionary 和 String 接收到 null。 它可以通过调用 GetType 方法的重载处理该情况,这是因为两个非限定类型名称都在 Mscorlib.dll 中:

C#

复制

Type t = Type.GetType(test,

(aName) => aName.Name == "MyAssembly" ?

Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") : null,

(assem, name, ignore) => assem == null ?

Type.GetType(name, false, ignore) :

assem.GetType(name, false, ignore)

);

不会为字典类型和字符串类型调用 assemblyResolver 方法,因为这些类型名称不是程序集限定名称。

现在假设,第一个泛型参数类型不是 System.String,而是 YourAssembly 中的 YourType:

复制

"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"

由于此程序集不是 Mscorlib.dll,也不是当前正在执行的程序集,因此没有程序集限定的名称时不能解析 YourType。 由于您的 assemblyResolve 将被递归调用,因此必须能够处理此情况。 它现在使用提供的 AssemblyName 对象执行程序集加载,而不是对 MyAssembly 之外的其他程序集返回 null。

C#

复制

Type t2 = Type.GetType(test,

(aName) => aName.Name == "MyAssembly" ?

Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") :

Assembly.Load(aName),

(assem, name, ignore) => assem == null ?

Type.GetType(name, false, ignore) :

assem.GetType(name, false, ignore), true

);

返回到用法说明。

解析具有特殊字符的类型名称

某些字符在程序集限定的名称中具有特殊含义。 如果简单类型名称中包含这些字符,则在简单名称作为程序集限定名称一部分的情况下,这些字符将导致分析错误。 为了避免出现分析错误,您必须用反斜杠转义特殊字符,然后才能将程序集限定名称传递给 GetType 方法。 例如,如果类型命名为 Strange]Type,则必须在方括号前添加转义字符,如下所示:Strange\]Type。

注意

不能在 Visual Basic 或 C# 中创建具有此类特殊字符的名称,但可以通过使用 Microsoft 中间语言 (MSIL) 或者通过发出动态程序集来创建。

下表显示了类型名称的特殊字符。

字符

含义

,(逗号)

程序集限定名称的分隔符。

[](方括号)

作为后缀对,表示数组类型;作为分隔符,将泛型参数列表和程序集限定名引起来。

&(“and”符)

作为后缀,表示类型为引用类型。

*(星号)

作为后缀,表示类型为指针类型。

+(加号)

嵌套类型的分隔符。

\(反斜杠)

转义符。

属性(如 AssemblyQualifiedName)返回正确转义的字符串。 您必须向 GetType 方法传递正确转义的字符串。 接下来,GetType 方法将转义名称正确传递给 typeResolver 和默认类型解析方法。 如果需要将某名称与 typeResolver 中未转义的名称进行比较,则必须移除转义字符。

返回到用法说明。

混合名称解析

下表总结了 assemblyResolver 和 typeResolver 之间的交互以及默认名称解析(针对 typeName 中类型名称和程序集名称的所有组合)。

类型名称的内容。

程序集冲解析程序方法

类型解析程序方法

结果

类型,程序集

null

null

等效于调用 Type.GetType(String, Boolean, Boolean) 方法重载。

类型,程序集

已提供

null

assemblyResolver 返回程序集,在无法解析程序集时返回 null。 如果该程序集已解析,则使用 Assembly.GetType(String, Boolean, Boolean) 方法重载来从程序集加载该类型;否则,将不尝试解析该类型。

类型,程序集

null

已提供

等效于将程序集名称转换为 AssemblyName 对象,并调用 Assembly.Load(AssemblyName) 方法重载来获取程序集。 如果该程序集已解析,则它传递给 typeResolver;否则,将不调用 typeResolver 且不进一步尝试解析该类型。

类型,程序集

已提供

已提供

assemblyResolver 返回程序集,在无法解析程序集时返回 null。 如果该程序集已解析,则它传递给 typeResolver;否则,将不调用 typeResolver 且不进一步尝试解析该类型。

type

null,已提供

null

等效于调用 Type.GetType(String, Boolean, Boolean) 方法重载。 由于未提供程序集名称,因此只搜索 Mscorlib.dll 和当前正在执行的程序集。 如果提供了 assemblyResolver,则忽略它。

type

null,已提供

已提供

系统调用了 typeResolver,并为程序集传递了 null。 typeResolver 可以提供任何程序集(包括它专门加载的程序集)中的类型。 如果提供了 assemblyResolver,则忽略它。

assembly

null,已提供

null,已提供

引发 FileLoadException,因为程序集名称会当作程序集限定的类型名称一样进行分析。 这将导致无效的程序集名称。

返回到:用法说明、解析程序集、解析类型。

System.Type.GetType 方法 (String, Func, Func, Boolean, Boolean)例子


异常

异常 异常描述
ArgumentNullException typeName 为 null。
TargetInvocationException 调用类初始值设定项并引发异常。
TypeLoadException
  • throwOnError 为 true,未找到该类型。
  • throwOnError 为 true 并且 typeName 包含无效的字符,如内嵌选项卡。
  • throwOnError 为 true 并且 typeName 为空字符串。
  • throwOnError 为 true 并且 typeName 表示具有无效大小的数组类型。
  • typeName 表示 TypedReference 的数组。
ArgumentException
  • 当 typeName 分析为类型名称和程序集名称(例如当简单类型名包含未转义的特殊字符)时,将发生错误。
  • throwOnError 为 true 且 typeName 包含无效的语法(例如,"MyType[,*,]")。
  • typeName 表示具有指针类型、ByRef 类型或 Void 作为其类型参数之一的泛型类型。
  • typeName 表示具有不正确数量的类型参数的泛型类型。
  • typeName 表示泛型类型,其类型参数之一不满足对应类型参数的约束。
FileNotFoundException throwOnError 为 true,并且未找到该程序集或其依赖项之一。
FileLoadException
  • 找到了该程序集或它的某个依赖项,但未能加载。
  • typeName 包含无效的程序集名称。
  • typeName 是不含类型名称的有效程序集名称。
BadImageFormatException
  • 该程序集或它的某个依赖项无效。
  • 该程序集是使用比当前加载的版本更高的公共语言运行时版本编译的。

命名空间

namespace: System

程序集: mscorlib(在 mscorlib.dll 中)

版本信息

.NET Framework 受以下版本支持:4 .NET Framework Client Profile 受以下版本支持:4

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。