Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
仅当程序集限定类型出现在类型参数列表中时,才能将其括在方括号中。 用于在类型参数列表中搜索限定和未限定类型的程序集的规则与限定和未限定非常规类型的规则相同。
可以为 Null 的类型是泛型类型的特例。 例如,可为 null 值 Int32 由字符串“System.Nullable'1[System.Int32]”表示。
在 C#、C++ 和 Visual Basic 中,还可以使用类型运算符获取可为 null 的类型。 例如,可为 Boolean null 的类型在 C# 中返回,在 C++ 中由 Nullable<Boolean>::typeid 返回,在 Visual Basic 中由 返回typeof(Nullable<bool>)GetType(Nullable(Of Boolean))。
下表显示了用于各种类型的语法 GetType 。
具有两个程序集限定类型参数的泛型类型
Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]")
具有程序集限定类型参数的程序集限定泛型类型
Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly")
一个泛型类型,其类型参数是具有两个类型参数的泛型类型
Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]")
public:
static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver);
public static Type? GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver);
public static Type GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly> assemblyResolver, Func<System.Reflection.Assembly,string,bool,Type> typeResolver);
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> -> Type
Public Shared Function GetType (typeName As String, assemblyResolver As Func(Of AssemblyName, Assembly), typeResolver As Func(Of Assembly, String, Boolean, Type)) As Type
一个方法,它定位并返回 typeName 中指定的程序集。 以 assemblyResolver 对象形式传递给 AssemblyName 的程序集名称。 如果 typeName 不包含程序集的名称,则不调用 assemblyResolver。 如果未提供 assemblyResolver,则执行标准程序集解析。
警告 不要从未知或不受信任的调用方传递方法。 此操作可能会导致恶意代码特权提升。 仅使用你提供或者熟悉的方法。
一个方法,它在由 typeName 或标准程序集解析返回的程序集中定位并返回 assemblyResolver 所指定的类型。 如果未提供任何程序集,则 typeResolver 方法可以提供一个程序集。 该方法还采用一个参数以指定是否执行不区分大小写的搜索;false 传递给该参数。
警告 不要从未知或不受信任的调用方传递方法。
当 typeName 解析为类型名称和程序集名称时(例如,当简单类型名称包含未转义的特殊字符时),发生错误。
typeName 表示将指针类型、ByRef 类型或 Void 作为其类型参数之一的泛型类型。
typeName 表示具有错误的类型参数数目的泛型类型。
typeName 表示泛型类型,并且其类型参数之一不满足相应类型参数的约束。
此方法的使用方案以及有关 assemblyResolver 和 typeResolver 参数的详细信息可在方法重载中找到 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) 。
如果 typeName 找不到 ,则对 方法的 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) 调用将返回 null。 它不会引发异常。 若要控制是否引发异常,请调用具有 throwOnError 参数的方法的GetType重载。
调用此方法重载与调用 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) 方法重载并指定 falsethrowOnError 和 ignoreCase 参数相同。
public:
static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver, bool throwOnError);
public static Type? GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver, bool throwOnError);
public static Type GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly> assemblyResolver, Func<System.Reflection.Assembly,string,bool,Type> typeResolver, bool throwOnError);
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool -> Type
Public Shared Function GetType (typeName As String, assemblyResolver As Func(Of AssemblyName, Assembly), typeResolver As Func(Of Assembly, String, Boolean, Type), throwOnError As Boolean) As Type
一个方法,它定位并返回 typeName 中指定的程序集。 以 assemblyResolver 对象形式传递给 AssemblyName 的程序集名称。 如果 typeName 不包含程序集的名称,则不调用 assemblyResolver。 如果未提供 assemblyResolver,则执行标准程序集解析。
警告 不要从未知或不受信任的调用方传递方法。 此操作可能会导致恶意代码特权提升。 仅使用你提供或者熟悉的方法。
一个方法,它在由 typeName 或标准程序集解析返回的程序集中定位并返回 assemblyResolver 所指定的类型。 如果未提供任何程序集,则该方法可以提供一个程序集。 该方法还采用一个参数以指定是否执行不区分大小写的搜索;false 传递给该参数。
警告 不要从未知或不受信任的调用方传递方法。
如果为 true,则在找不到该类型时引发异常;如果为 false,则返回 null。 指定 false 还会取消某些其他异常条件,但并不取消所有条件。 请参见“异常”部分。
throwOnError 的值为 true,且 typeName 包含无效字符,例如嵌入的制表符。
throwOnError 的值为 true,且 typeName 为空字符串。
throwOnError 的值为 true,且 typeName 表示大小无效的数组类型。
typeName 表示 TypedReference 的数组。
当 typeName 解析为类型名称和程序集名称时(例如,当简单类型名称包含未转义的特殊字符时),发生错误。
throwOnError 是 true,且 typeName 包含无效的语法(例如 "MyType[,*,]")。
typeName 表示将指针类型、ByRef 类型或 Void 作为其类型参数之一的泛型类型。
typeName 表示具有错误的类型参数数目的泛型类型。
typeName 表示泛型类型,并且其类型参数之一不满足相应类型参数的约束。
此方法的使用方案以及有关 assemblyResolver 和 typeResolver 参数的详细信息可在方法重载中找到 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) 。
调用此方法重载与调用GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean)方法重载并指定falseignoreCase参数相同。
public:
static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver, bool throwOnError, bool ignoreCase);
public static Type? GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver, bool throwOnError, bool ignoreCase);
public static Type GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly> assemblyResolver, Func<System.Reflection.Assembly,string,bool,Type> typeResolver, bool throwOnError, bool ignoreCase);
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool * bool -> Type
Public Shared Function GetType (typeName As String, assemblyResolver As Func(Of AssemblyName, Assembly), typeResolver As Func(Of Assembly, String, Boolean, Type), throwOnError As Boolean, ignoreCase As Boolean) As Type
一个方法,它定位并返回 typeName 中指定的程序集。 以 assemblyResolver 对象形式传递给 AssemblyName 的程序集名称。 如果 typeName 不包含程序集的名称,则不调用 assemblyResolver。 如果未提供 assemblyResolver,则执行标准程序集解析。
警告 不要从未知或不受信任的调用方传递方法。 此操作可能会导致恶意代码特权提升。 仅使用你提供或者熟悉的方法。
一个方法,它在由 typeName 或标准程序集解析返回的程序集中定位并返回 assemblyResolver 所指定的类型。 如果未提供任何程序集,则该方法可以提供一个程序集。 该方法还采用一个参数以指定是否执行不区分大小写的搜索;ignoreCase 的值传递给该参数。
警告 不要从未知或不受信任的调用方传递方法。
throwOnError 的值为 true,且 typeName 包含无效字符,例如嵌入的制表符。
throwOnError 的值为 true,且 typeName 为空字符串。
throwOnError 的值为 true,且 typeName 表示大小无效的数组类型。
typeName 表示 TypedReference 的数组。
当 typeName 解析为类型名称和程序集名称时(例如,当简单类型名称包含未转义的特殊字符时),发生错误。
throwOnError 是 true,且 typeName 包含无效的语法(例如 "MyType[,*,]")。
typeName 表示将指针类型、ByRef 类型或 Void 作为其类型参数之一的泛型类型。
typeName 表示具有错误的类型参数数目的泛型类型。
typeName 表示泛型类型,并且其类型参数之一不满足相应类型参数的约束。
使用此方法重载及其关联的重载 (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) 和 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)) ,将方法的默认实现 GetType 替换为更灵活的实现。 通过提供自己的方法解析类型名称以及包含它们的程序集的名称,可以执行以下操作:
控制从中加载类型的程序集版本。
提供另一个位置来查找不包含程序集名称的类型名称。
使用部分程序集名称加载程序集。
返回不是由公共语言运行时 (CLR) 创建的子类 System.Type 。
例如,在版本容错序列化中,此方法使你能够使用部分名称搜索“最适合”程序集。 方法的其他重载 GetType 需要程序集限定的类型名称,其中包括版本号。
类型系统的备用实现可能需要返回不是由 CLR 创建的 子类 System.Type ;该方法的其他重载 GetType 返回的所有类型都是运行时类型。
此方法重载及其关联的重载将分析 typeName 为类型的名称和程序集的名称,然后解析这些名称。 程序集名称的解析发生在类型名称解析之前,因为必须在程序集的上下文中解析类型名称。
如果不熟悉程序集限定类型名称的概念,请参阅 AssemblyQualifiedName 属性。
如果 typeName 不是程序集限定的名称,则会跳过程序集解析。 可以在 mscorlib.dll/System.Private.CoreLib.dll 或当前正在执行的程序集的上下文中解析不限定的类型名称,也可以选择在 参数中 typeResolver 提供程序集。 包含或省略不同类型名称解析的程序集名称的效果显示为 “混合名称解析 ”部分中的表。
常规用法说明:
如果方法来自未知或不受信任的调用方,请不要将 assemblyResolver 方法传递给 或 typeResolver 。 仅使用你提供或者熟悉的方法。
使用来自未知或不受信任的调用方的方法可能会导致恶意代码的特权提升。
如果省略 assemblyResolver 和/或 typeResolver 参数,参数的值 throwOnError 将传递给执行默认解析的方法。
如果 throwOnError 为 true,则此方法在TypeLoadException返回 null时typeResolver引发 ,FileNotFoundException当返回 时assemblyResolver,此方法将引发 。null
此方法不会捕获 和 typeResolver引发的assemblyResolver异常。 你应对解析程序方法引发的任何异常负责。
解析程序集
方法 assemblyResolver 接收一个 AssemblyName 对象,该对象是通过分析 中包含的 typeName字符串程序集名称生成的。 如果 typeName 不包含程序集名称, assemblyResolver 则不调用 ,并且 null 将 typeResolver传递给 。
如果未 assemblyResolver 提供 ,则使用标准程序集探测来查找程序集。 如果 assemblyResolver 提供 ,则 GetType 方法不执行标准探测;在这种情况下,必须确保 assemblyResolver 可以处理传递给它的所有程序集。
如果无法解析程序集,方法 assemblyResolver 应返回 null 。 如果 assemblyResolver 返回 null, typeResolver 则不调用 并且不会进行进一步的处理;此外,如果 throwOnError 为 true, FileNotFoundException 则引发 。
AssemblyName如果传递给 assemblyResolver 的 是部分名称,则其一个或多个部分为 null。 例如,如果它没有版本,则 Version 属性为 null。 Version如果 属性、CultureInfo属性和 GetPublicKeyToken 方法都返回 null,则仅提供程序集的简单名称。 方法 assemblyResolver 可以使用或忽略程序集名称的所有部分。
对于简单和程序集限定的类型名称,不同程序集解析选项的效果显示为 “混合名称解析 ”部分中的一个表。
如果未 typeName 指定程序集名称, typeResolver 则始终调用 。 如果 typeName 指定程序集名称, typeResolver 则仅在成功解析程序集名称时调用 。 如果 assemblyResolver 或 标准程序集探测返回 null, typeResolver 则不调用 。
方法 typeResolver 接收三个参数:
要搜索的程序集,如果 nulltypeName 不包含程序集名称,则为 。
类型的简单名称。 对于嵌套类型,这是最外层的包含类型。 对于泛型类型,这是泛型类型的简单名称。
一个布尔值,如果 true 类型名称大小写将被忽略,则为 。
实现确定这些参数的使用方式。 typeResolver如果方法无法解析类型,则该方法应返回 null 。 如果 typeResolver 返回 null 和 throwOnError 为 true,则 的 GetType 此重载将 TypeLoadException引发 。
对于简单和程序集限定的类型名称,不同类型解析选项的效果显示为 “混合名称解析 ”部分中的一个表。
解析嵌套类型
如果 typeName 是嵌套类型,则仅将最外层包含类型的名称传递给 typeResolver。 返回此类型时 typeResolver , GetNestedType 以递归方式调用 方法,直到最内部的嵌套类型已解析。
解析泛型类型
GetType以递归方式调用 以解析泛型类型:首先解析泛型类型本身,然后解析其类型参数。 如果类型参数为泛型, GetType 则以递归方式调用 以解析其类型参数,依此类而论。
提供的 和 typeResolver 的组合assemblyResolver必须能够解析此递归的所有级别。 例如,假设你提供一个 assemblyResolver 控制 加载的 MyAssembly。 假设你想要在 Visual Basic) Dictionary(Of String, MyType) 中解析泛型类型Dictionary<string, MyType> (。 可以传递以下泛型类型名称:
"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"
请注意, MyType 是唯一程序集限定的类型参数。 和 String 类的名称Dictionary<TKey,TValue>不是程序集限定的。 必须 typeResolver 能够处理程序集或 null,因为它将接收 null 和 Dictionary<TKey,TValue>String。 它可以通过调用采用字符串的方法的 GetType 重载来处理这种情况,因为两个非限定类型名称都在 /System.Private.CoreLib.dll mscorlib.dll中:
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)
let t =
Type.GetType(test,
(fun aName ->
if aName.Name = "MyAssembly" then
Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
else null),
fun assem name ignr ->
if assem = null then
Type.GetType(name, false, ignr)
assem.GetType(name, false, ignr))
assemblyResolver不会为字典类型和字符串类型调用 方法,因为这些类型名称不是程序集限定的。
现在,假设第一个 System.String泛型参数类型是 YourType,而不是 ,来自 YourAssembly:
"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"
由于此程序集既不是mscorlib.dll/System.Private.CoreLib.dll,也不是当前正在执行的程序集,因此如果没有程序集限定名称,则无法解析 YourType 。 由于将以递归方式调用, assemblyResolve 因此它必须能够处理这种情况。 它现在使用提供的 AssemblyName 对象执行程序集加载,而不是为 以外的MyAssembly程序集返回 null 。
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
let t2 =
Type.GetType(test,
(fun aName ->
if aName.Name = "MyAssembly" then
Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
else Assembly.Load aName),
(fun assem name ignr ->
if assem = null then
Type.GetType(name, false, ignr)
assem.GetType(name, false, ignr)), true)
返回到 使用情况说明。
解析具有特殊字符的类型名称
某些字符在程序集限定名称中具有特殊含义。 如果简单类型名称包含这些字符,则当简单名称是程序集限定名称的一部分时,这些字符会导致分析错误。 若要避免分析错误,必须先使用反斜杠转义特殊字符,然后才能将程序集限定名称传递给 GetType 方法。 例如,如果类型名为 Strange]Type,则必须在方括号前面添加转义字符,如下所示: Strange\]Type。
不能在 Visual Basic 或 C# 中创建具有此类特殊字符的名称,但可以使用 Microsoft 中间语言 (MSIL) 或通过发出动态程序集来创建。
下表显示了类型名称的特殊字符。
属性(如 AssemblyQualifiedName )返回正确转义的字符串。 必须将正确的转义字符串传递给 GetType 方法。 方法又 GetType 将正确转义的名称传递给 typeResolver 和 默认类型解析方法。 如果需要将名称与 中的 typeResolver未转义名称进行比较,则必须删除转义字符。
返回到 使用情况说明。
混合名称解析
下表汇总了 、 typeResolver和 默认名称解析之间的assemblyResolver交互,用于 中typeName类型名称和程序集名称的所有组合:
类型名称的内容
程序集解析程序方法
类型解析程序方法
assemblyResolver 返回程序集,如果无法解析程序集,则返回 null 。 如果已解析程序集,则 Assembly.GetType(String, Boolean, Boolean) 使用方法重载从程序集加载类型;否则,不会尝试解析该类型。
type, assembly
等效于将程序集名称转换为 AssemblyName 对象并调用 Assembly.Load(AssemblyName) 方法重载以获取程序集。 如果已解析程序集,则将其传递给 typeResolver;否则, typeResolver 不会调用 ,并且不会进一步尝试解析类型。
type, assembly
assemblyResolver 返回程序集,如果无法解析程序集,则返回 null 。 如果已解析程序集,则将其传递给 typeResolver;否则, typeResolver 不会调用 ,并且不会进一步尝试解析类型。
null,提供
等效于调用 Type.GetType(String, Boolean, Boolean) 方法重载。 由于未提供程序集名称,因此仅搜索 mscorlib.dll/System.Private.CoreLib.dll 和当前正在执行的程序集。 如果 assemblyResolver 提供 ,则忽略它。
null,提供
typeResolver 调用 ,并为 null 程序集传递 。 typeResolver 可以从任何程序集提供类型,包括它为目的加载的程序集。 如果 assemblyResolver 提供 ,则忽略它。
程序集 (assembly)
null,提供
null,提供
FileLoadException引发 ,因为程序集名称被分析为程序集限定的类型名称。 这会导致程序集名称无效。
返回到: 使用说明、 解析程序集、 解析类型。