Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
仅当程序集限定类型出现在类型参数列表中时,才可以将其括在括号中。 用于在类型参数列表中搜索限定类型和非限定类型的程序集的规则与限定和非限定非泛型类型的规则相同。
可以为 null 的类型是泛型类型的特例。 例如, Int32 字符串 "system.string" 1 [system.exception] 表示可以为 null。
在 c #、c + + 和 Visual Basic 中,还可以使用类型运算符获取可以为 null 的类型。 例如,可以为 null 的 Boolean 类型由 typeof(Nullable<bool>)
c # 中的、通过 Nullable<Boolean>::typeid
c + + 返回, GetType(Nullable(Of Boolean))
在 Visual Basic 中返回。
下表显示了 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
传递给该参数。
警告 不要通过未知的或不受信任的调用方传递方法。
此方法的使用方案以及有关和参数的详细信息 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
。 它不会引发异常。 若要控制是否引发异常,请调用 GetType 具有参数的方法的重载 throwOnError
。
调用此方法重载与调用 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) 方法重载和 false
为 throwOnError
和参数指定的方法相同 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
还会取消某些其他异常条件,但并不取消所有条件。 请参见“异常”部分。
此方法的使用方案以及有关和参数的详细信息 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) 方法重载和为参数指定的方法相同 false
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, 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
的值传递给该参数。
警告 不要通过未知的或不受信任的调用方传递方法。
使用此方法重载及其关联重载 (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) 和 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)) ,将方法的默认实现替换为 GetType 更灵活的实现。 通过提供自己的方法来解析类型名称以及包含它们的程序集的名称,您可以执行以下操作:
控制从其加载类型的程序集的版本。
提供另一个查找不包括程序集名称的类型名称的位置。
使用部分程序集名称加载程序集。
返回 System.Type 不是由公共语言运行时 (CLR) 创建的子类。
例如,在版本容错序列化中,此方法使你能够使用部分名称搜索 "最适合" 程序集。 此方法的其他重载 GetType 需要程序集限定的类型名称,包括版本号。
类型系统的其他实现可能需要返回 System.Type 不是由 CLR 创建的的子类; 该方法的其他重载返回的所有类型 GetType 都是运行时类型。
此方法重载及其关联重载分析 typeName
为类型名称和程序集名称,然后解析名称。 程序集名称的解析出现在类型名称解析之前,因为类型名称必须在程序集的上下文中解析。
如果不熟悉程序集限定类型名称的概念,请参见 AssemblyQualifiedName 属性。
如果不 typeName
是程序集限定名称,则跳过程序集解析。 可在 mscorlib.dll/System.Private.CoreLib.dll 或当前正在执行的程序集的上下文中解析不合格的类型名称,也可以选择在参数中提供程序集 typeResolver
。 包括或省略不同类型名称解析的程序集名称的效果在 混合名称解析 部分中显示为一个表。
一般使用说明:
如果方法来自 assemblyResolver
typeResolver
未知或不受信任的调用方,请不要将方法传递给或。 仅使用你提供或者熟悉的方法。
使用来自未知或不受信任调用方的方法可能会导致恶意代码特权提升。
如果省略了 assemblyResolver
和/或 typeResolver
参数,则参数的值 throwOnError
将传递给执行默认解析的方法。
如果 throwOnError
为 true
,则此方法 TypeLoadException 在返回时引发 typeResolver
null
,而 FileNotFoundException 在 assemblyResolver
返回时引发 null
。
此方法不会捕获和引发的 assemblyResolver
异常 typeResolver
。 你负责解析程序方法引发的任何异常。
解析程序集
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
方法收到三个参数:
要搜索的程序集, null
如果不 typeName
包含程序集名称,则为。
类型的简单名称。 对于嵌套类型,这是最外层的包含类型。 对于泛型类型,这是泛型类型的简单名称。
一个布尔值, true
如果要忽略类型名称的大小写,则为。
实现确定使用这些参数的方式。 typeResolver
如果方法无法解析类型,则应返回 null
。 如果 typeResolver
返回 null
且 throwOnError
为 true
,则的此重载将 GetType 引发 TypeLoadException 。
对于简单的和程序集限定的类型名称,不同类型解析选项的效果在 混合名称解析 部分中显示为一个表。
解析嵌套类型
如果 typeName
是嵌套类型,则仅将包含类型的最外面的名称传递给 typeResolver
。 当 typeResolver
返回此类型时,将 GetNestedType 以递归方式调用方法,直到解析最内层的嵌套类型。
解析泛型类型
以 GetType 递归方式调用以解析泛型类型:首先解析泛型类型本身,然后解析其类型自变量。 如果类型参数是泛型, GetType 则会以递归方式调用以解析其类型参数,依此类推。
assemblyResolver
您提供的和的组合 typeResolver
必须能够解析此递归的所有级别。 例如,假设您提供了一个 assemblyResolver
,用于控制的加载 MyAssembly
。 假设要解析 Dictionary<string, MyType>
Visual Basic) 中 (的泛型类型 Dictionary(Of String, MyType)
。 你可能会传递以下泛型类型名称:
"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"
请注意, MyType
是唯一的程序集限定类型参数。 和类的名称 Dictionary<TKey,TValue> String 不是程序集限定的。 typeResolver
必须能够处理程序集或 null
,因为它将接收 null
Dictionary<TKey,TValue> 和 String 。 它可以通过调用采用字符串的方法重载来处理这种情况 GetType ,因为两个非限定类型名称都在 mscorlib.dll/System.Private.CoreLib.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)
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]]"
由于此程序集既不 System.Private.CoreLib.dll mscorlib.dll也不是当前正在执行的程序集,因此无法在 YourType
没有程序集限定名称的情况下解析。 由于 assemblyResolve
将以递归方式调用,因此它必须能够处理这种情况。 null
MyAssembly
它现在会使用提供的对象执行程序集加载,而不是为之外的程序集进行返回 AssemblyName 。
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) 或发出动态程序集来创建它们。
下表显示了类型名称的特殊字符。
诸如 AssemblyQualifiedName 返回正确转义的字符串之类的属性。 必须将正确转义的字符串传递给 GetType 方法。 相反,该 GetType 方法将正确的转义名称传递给 typeResolver
和的默认类型解析方法。 如果需要将名称与中的非转义名称进行比较 typeResolver
,则必须删除转义符。
返回到 使用说明。
混合名称解析
下表总结了 assemblyResolver
、 typeResolver
和默认名称解析之间的交互,适用于中的类型名称和程序集名称的所有组合 typeName
:
类型名称的内容
程序集解析程序方法
类型解析程序方法
assemblyResolver
返回程序集, null
如果无法解析程序集,则返回。 如果对程序集进行解析,则 Assembly.GetType(String, Boolean, Boolean) 使用方法重载从程序集加载类型; 否则,将不会尝试解析该类型。
类型、程序集
等效于将程序集名称转换为 AssemblyName 对象,并调用 Assembly.Load(AssemblyName) 方法重载以获取程序集。 如果对程序集进行解析,则将其传递到 typeResolver
; 否则,将不会调用,也不 typeResolver
会再尝试解析该类型。
类型、程序集
assemblyResolver
返回程序集, null
如果无法解析程序集,则返回。 如果对程序集进行解析,则将其传递到 typeResolver
; 否则,将不会调用,也不 typeResolver
会再尝试解析该类型。
等效于调用 Type.GetType(String, Boolean, Boolean) 方法重载。 由于未提供程序集名称,因此只会搜索 mscorlib.dll/System.Private.CoreLib.dll 和当前正在执行的程序集。 如果 assemblyResolver
提供了,则将其忽略。
typeResolver
为 null
程序集调用并传递。 typeResolver
可以提供任何程序集中的类型,包括为此目的而加载的程序集。 如果 assemblyResolver
提供了,则将其忽略。
程序集 (assembly)
FileLoadException引发,因为程序集名称被分析为程序集限定的类型名称。 这会导致无效的程序集名称。
返回到: 使用说明, 解析程序集, 解析类型。