Type.GetType 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
获取表示 Type 指定类型的对象。
重载
| 名称 | 说明 |
|---|---|
| GetType() |
获取当前 Type。 |
| GetType(String) |
获取 Type 具有指定名称的、执行区分大小写的搜索。 |
| GetType(String, Boolean) |
获取 Type 具有指定名称的指定名称,执行区分大小写的搜索,并指定在找不到类型时是否引发异常。 |
| GetType(String, Boolean, Boolean) |
获取 Type 具有指定名称的指定名称,指定在找不到类型时是否引发异常,以及是否执行区分大小写的搜索。 |
| GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) |
获取具有指定名称的类型,可以选择提供用于解析程序集和类型的自定义方法。 |
| GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean) |
获取具有指定名称的类型,指定在找不到类型时是否引发异常,并选择性地提供自定义方法来解析程序集和类型。 |
| GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) |
获取具有指定名称的类型,指定是否执行区分大小写的搜索,以及是否在找不到类型时引发异常,还可以选择提供自定义方法来解析程序集和类型。 |
GetType(String)
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
获取 Type 具有指定名称的、执行区分大小写的搜索。
public:
static Type ^ GetType(System::String ^ typeName);
public static Type GetType(string typeName);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
public static Type? GetType(string typeName);
public static Type? GetType(string typeName);
static member GetType : string -> Type
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string -> Type
Public Shared Function GetType (typeName As String) As Type
参数
- typeName
- String
要获取的类型的程序集限定名称。 请参阅 AssemblyQualifiedName。 如果类型位于当前正在执行的程序集或 mscorlib.dll/System.Private.CoreLib.dll中,则足以提供其命名空间限定的类型名称。
返回
找到具有指定名称的类型;否则,为 null.
- 属性
例外
typeName 是 null。
调用类初始值设定项并引发异常。
typeName 表示具有指针类型、 ByRef 类型或 Void 作为其类型参数之一的泛型类型。
-或-
typeName 表示具有错误数量的类型参数的泛型类型。
-或-
typeName 表示泛型类型,其类型参数之一不满足相应类型参数的约束。
typeName 表示无效类型,例如,一个数组 TypedReference。
找到程序集或其依赖项之一,但无法加载。
注意:在 Windows Store 应用的 .NET 或 Portable 类库中,请改为捕获基类异常,IOException。
程序集对当前加载的运行时无效。
示例
下面的示例检索 System.Int32 类型并使用该类型对象显示 FullName 其属性 System.Int32。
using System;
class GetTypeExample
{
public static void Main()
{
try {
// Get the type of a specified class.
Type myType1 = Type.GetType("System.Int32");
Console.WriteLine("The full name is {0}.\n", myType1.FullName);
}
catch (TypeLoadException e)
{
Console.WriteLine("{0}: Unable to load type System.Int32", e.GetType().Name);
}
try {
// 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("{0}: Unable to load type NoneSuch", e.GetType().Name);
}
}
}
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
open System
try
// Get the type of a specified class.
let myType1 = Type.GetType "System.Int32"
printfn $"The full name is {myType1.FullName}.\n"
with :? TypeLoadException as e ->
printfn $"{e.GetType().Name}: Unable to load type System.Int32"
try
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
let myType2 = Type.GetType("NoneSuch", true)
printfn $"The full name is {myType2.FullName}."
with :? TypeLoadException as e ->
printfn $"{e.GetType().Name}: Unable to load type NoneSuch"
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
Class Example
Public Shared Sub Main()
Try
' Get the type of the specified class.
Dim myType1 As Type = Type.GetType("System.Int32")
Console.WriteLine("The full name is {0}.", myType1.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type System.Int32",
e.GetType().Name)
End Try
Console.WriteLine()
Try
' Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Dim myType2 As Type = Type.GetType("NoneSuch", True)
Console.WriteLine("The full name is {0}.", myType2.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type NoneSuch", e.GetType().Name)
End Try
End Sub
End Class
' The example displays the following output:
' The full name is System.Int32.
'
' TypeLoadException: Unable to load type NoneSuch
注解
如果知道其程序集限定名称,则可以使用 GetType 该方法获取另一 Type 个程序集中的类型的对象,该名称可从中 AssemblyQualifiedName获取。
GetType 导致加载在 . 中指定的 typeName程序集。 还可以使用 Assembly.Load 该方法加载程序集,然后使用 Assembly.GetType 或 Assembly.GetTypes 方法获取 Type 对象。 如果类型在编译时在程序已知的程序集中,则使用 C# 中的 typeof 或 Visual Basic 中的 GetType 运算符会更有效。
注释
如果 typeName 找不到,则对方法的 GetType(String) 调用将 null返回 。 它不会引发异常。 若要控制是否引发异常,请调用具有GetType参数的方法的throwOnError重载。
仅.NET框架:GetType仅适用于从磁盘加载的程序集。 如果调用 GetType 查找使用 System.Reflection.Emit 服务定义的动态程序集中定义的类型,则可能会出现不一致的行为。 此行为取决于动态程序集是永久性的,即使用RunAndSaveSave枚举的访问模式System.Reflection.Emit.AssemblyBuilderAccess创建的。 如果动态程序集是永久性的并且以前已写入磁盘 GetType ,则加载程序会在磁盘上查找保存的程序集,加载该程序集,并从该程序集检索类型。 如果在调用时 GetType 程序集尚未保存到磁盘,该方法将 null返回。
GetType 不了解暂时性动态程序集;因此,调用 GetType 以检索暂时性动态程序集中的类型将 null返回。
在 .NET Framework 中,若要在动态模块上使用 GetType,请订阅 AppDomain.AssemblyResolve 事件,并在保存前调用 GetType。 否则,将在内存中获取程序集的两个副本。
在 .NET Core 3.0 及更高版本上,此 API 触发的程序集加载受当前值 AssemblyLoadContext.CurrentContextualReflectionContext 的影响。
下表显示了通过 Get 方法在反射类型时返回的基类成员。
| 成员类型 | Static | 非静态 |
|---|---|---|
| 构造函数 | 否 | 否 |
| 领域 | 否 | Yes. 字段始终是按名称和签名隐藏的。 |
| 事件 | 不適用 | 常见的类型系统规则是继承与实现属性的方法相同。 反射将属性视为按名称和签名隐藏。 请参阅下面的说明 2。 |
| 方法 | 否 | Yes. 方法(虚拟和非虚拟)可以按名称隐藏或按名称和签名隐藏。 |
| 嵌套类型 | 否 | 否 |
| 财产 | 不適用 | 常见的类型系统规则是继承与实现属性的方法相同。 反射将属性视为按名称和签名隐藏。 请参阅下面的说明 2。 |
按名称和签名隐藏会考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、sentinel 和非托管调用约定。 这是二进制比较。
对于反射,属性和事件通过名称和签名进行隐藏。 如果基类中同时具有 get 和 set 访问器的属性,但派生类只有 get 访问器,则派生类属性将隐藏基类属性,并且无法访问基类上的 setter。
自定义属性不是常见类型系统的一部分。
除非数组或 COM 类型已加载到可用类的表中,否则不会搜索它们。
typeName 可以是由其命名空间限定的类型名称,也可以是包含程序集名称规范的程序集限定名称。 请参阅 AssemblyQualifiedName。
如果 typeName 包含命名空间而不是程序集名称,则此方法按该顺序仅搜索调用对象的程序集并 mscorlib.dll/System.Private.CoreLib.dll。 如果使用部分或完整的程序集名称完全限定 typeName,此方法将在指定的程序集中搜索。 如果程序集具有强名称,则需要完整的程序集名称。
该 AssemblyQualifiedName 属性返回完全限定的类型名称,包括嵌套类型、程序集名称和泛型类型参数。 支持公共语言运行时的所有编译器都将发出嵌套类的简单名称,并且反射会根据以下约定在查询时构造一个混乱的名称。
注释
处理器体系结构是程序集标识的一部分,可以指定为程序集名称字符串的一部分。 例如,“ProcessorArchitecture=msil”。 但是,出于兼容性原因,它不包含在属性返回的 AssemblyQualifiedName 字符串中。 还可以通过创建对象 AssemblyName 并将其传递给方法的适当 Load 重载来加载类型。 然后,可以使用该方法 Assembly.GetType 从程序集加载类型。 另请参阅 AssemblyName.ProcessorArchitecture。
| 分隔符 | 含义 |
|---|---|
| 反斜杠 (\) | 转义字符。 |
| 反杆 (') | 位于泛型类型名称末尾的一个或多个表示类型参数数的数字之前。 |
| 方括号 ([]) | 为构造的泛型类型将泛型类型参数列表括起来;在类型参数列表中,将程序集限定的类型括起来。 |
| 逗号 (,) | 在程序集名称之前。 |
| 句点 (.) | 表示命名空间标识符。 |
| 加号 (+) | 在嵌套类之前。 |
例如,类的完全限定名称可能如下所示:
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
如果命名空间为 TopNamespace.Sub+Namespace,则字符串必须位于加号(+)前面,并带有转义字符(\),以防止将其解释为嵌套分隔符。 反射发出此字符串,如下所示:
TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly
“++”变为“\++”,“\”变为“\\”。
此限定名称可以持久保存,稍后用于加载 Type。 若要搜索和加载 a Type,请仅对类型名称或程序集限定类型名称使用 GetType 。 GetType 类型名称仅查找 Type 调用方程序集,然后在系统程序集中查找。 GetType 具有程序集限定类型名称的程序集将查找 Type 任何程序集。
类型名称可能包括表示有关类型的其他信息的尾随字符,例如类型是引用类型、指针类型还是数组类型。 若要检索没有这些尾随字符的类型名称,请使用 t.GetElementType().ToString(),其中的类型 t 。
空格与除程序集名称以外的所有类型名称组件相关。 在程序集名称中,“”分隔符之前的空格是相关的,但“,分隔符后面的空格将被忽略。
泛型类型的名称以反杆(')结尾,后跟表示泛型类型参数数的数字。 此名称管理的目的是允许编译器支持具有相同名称但类型参数数量不同的泛型类型,同时发生在同一范围内。 例如,反射从 Visual Basic 中的泛型方法Tuple`1和 Tuple`2 中的泛型方法返回Tuple(Of T)和 Tuple(Of T0, T1)的混乱名称,或Tuple<T>和 visual C# 中的 Tuple<T0, T1>。
对于泛型类型,类型参数列表括在括号中,类型参数用逗号分隔。 例如,泛型 Dictionary<TKey,TValue> 具有两个类型参数。 类型键的Dictionary<TKey,TValue>一个MyTypeString可能如下所示:
System.Collections.Generic.Dictionary`2[System.String,MyType]
若要在类型参数列表中指定程序集限定类型,请将程序集限定的类型括在括号内。 否则,分隔程序集限定名称部分的逗号将解释为分隔其他类型参数。 例如,一个 Dictionary<TKey,TValue>MyType fromMyAssembly.dll,其类型 String为键,可能按如下所示指定:
Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
注释
仅当程序集限定类型出现在类型参数列表中时,才能将其括在括号中。 在类型参数列表中搜索限定和未限定类型的程序集的规则与限定和非限定的非泛型类型的规则相同。
可为 Null 的类型是泛型类型的特殊情况。 例如,可为 Int32 null 值由字符串“System.Nullable'1[System.Int32]”表示。
注释
还可以使用类型运算符获取可为 null 的类型。 例如,Visual Basic中的 Boolean 和 typeof(Nullable<bool>) 返回可为 null 的 GetType(Nullable(Of Boolean)) 类型。
下表显示了用于 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("MyType[]") |
| 具有未知下限的一维数组 | Type.GetType("MyType[*]") |
| n 维数组 | 括号内的逗号 (,)共 n-1 次。 例如, System.Object[,,] 表示三维 Object 数组。 |
| 一维数组的数组 | Type.GetType("MyType[][]") |
| 具有未知下限的矩形二维数组 | Type.GetType("MyType[,]") |
| 具有一个类型参数的泛型类型 | 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]]") |
另请参阅
- String
- TypeLoadException
- AssemblyQualifiedName
- GetAssembly(Type)
- GetType(String)
- AssemblyName
- 指定完全限定的类型名称
适用于
GetType(String, Boolean)
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
获取 Type 具有指定名称的指定名称,执行区分大小写的搜索,并指定在找不到类型时是否引发异常。
public:
static Type ^ GetType(System::String ^ typeName, bool throwOnError);
public static Type GetType(string typeName, bool throwOnError);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
public static Type? GetType(string typeName, bool throwOnError);
public static Type? GetType(string typeName, bool throwOnError);
static member GetType : string * bool -> Type
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string * bool -> Type
Public Shared Function GetType (typeName As String, throwOnError As Boolean) As Type
参数
- typeName
- String
要获取的类型的程序集限定名称。 请参阅 AssemblyQualifiedName。 如果类型位于当前正在执行的程序集或 mscorlib.dll/System.Private.CoreLib.dll中,则足以提供其命名空间限定的类型名称。
- throwOnError
- Boolean
true 如果找不到类型,则引发异常; falsenull返回 。 指定 false 还会禁止其他一些异常条件,但并非所有异常条件。 请参阅“异常”部分。
返回
具有指定名称的类型。 如果未找到类型,则 throwOnError 参数指定是 null 返回还是引发异常。 在某些情况下,无论值如何 throwOnError,都会引发异常。 请参阅“异常”部分。
- 属性
例外
typeName 是 null。
调用类初始值设定项并引发异常。
throwOnError 是 true 且找不到类型。
-或-
throwOnError
true包含typeName无效字符,例如嵌入的选项卡。
-或-
throwOnError 是 true 空 typeName 字符串。
-或-
throwOnError表示truetypeName大小无效的数组类型。
-或-
typeName表示一个数组。TypedReference
throwOnError 是 true 且 typeName 包含无效语法。 例如,“MyType[,*,]”。
-或-
typeName 表示具有指针类型、 ByRef 类型或 Void 作为其类型参数之一的泛型类型。
-或-
typeName 表示具有错误数量的类型参数的泛型类型。
-或-
typeName 表示泛型类型,其类型参数之一不满足相应类型参数的约束。
throwOnError 是 true 并且找不到程序集或其依赖项之一。
找到程序集或其依赖项之一,但无法加载。
注意:在 Windows Store 应用的 .NET 或 Portable 类库中,请改为捕获基类异常,IOException。
程序集或其依赖项之一对当前加载的运行时无效。
示例
下面的示例检索 System.Int32 类型并使用该类型对象显示 FullName 其属性 System.Int32。 如果类型对象引用不存在的程序集,此示例将引发异常。
using System;
class GetTypeExample
{
public static void Main()
{
try {
// Get the type of a specified class.
Type myType1 = Type.GetType("System.Int32");
Console.WriteLine("The full name is {0}.\n", myType1.FullName);
}
catch (TypeLoadException e)
{
Console.WriteLine("{0}: Unable to load type System.Int32", e.GetType().Name);
}
try {
// 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("{0}: Unable to load type NoneSuch", e.GetType().Name);
}
}
}
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
open System
try
// Get the type of a specified class.
let myType1 = Type.GetType "System.Int32"
printfn $"The full name is {myType1.FullName}.\n"
with :? TypeLoadException as e ->
printfn $"{e.GetType().Name}: Unable to load type System.Int32"
try
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
let myType2 = Type.GetType("NoneSuch", true)
printfn $"The full name is {myType2.FullName}."
with :? TypeLoadException as e ->
printfn $"{e.GetType().Name}: Unable to load type NoneSuch"
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
Class Example
Public Shared Sub Main()
Try
' Get the type of the specified class.
Dim myType1 As Type = Type.GetType("System.Int32")
Console.WriteLine("The full name is {0}.", myType1.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type System.Int32",
e.GetType().Name)
End Try
Console.WriteLine()
Try
' Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Dim myType2 As Type = Type.GetType("NoneSuch", True)
Console.WriteLine("The full name is {0}.", myType2.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type NoneSuch", e.GetType().Name)
End Try
End Sub
End Class
' The example displays the following output:
' The full name is System.Int32.
'
' TypeLoadException: Unable to load type NoneSuch
注解
如果知道其程序集限定名称,则可以使用 GetType 该方法获取另一 Type 个程序集中的类型的对象,该名称可从中 AssemblyQualifiedName获取。
GetType 导致加载在 . 中指定的 typeName程序集。 还可以使用 Assembly.Load 该方法加载程序集,然后使用 Assembly.GetType 或 Assembly.GetTypes 方法获取 Type 对象。 如果类型在编译时在程序已知的程序集中,则使用 C# 中的 typeof 或 Visual Basic 中的 GetType 运算符会更有效。
仅.NET框架:GetType仅适用于从磁盘加载的程序集。 如果调用 GetType 查找使用 System.Reflection.Emit 服务定义的动态程序集中定义的类型,则可能会出现不一致的行为。 此行为取决于动态程序集是永久性的,即使用RunAndSaveSave枚举的访问模式System.Reflection.Emit.AssemblyBuilderAccess创建的。 如果动态程序集是永久性的并且以前已写入磁盘 GetType ,则加载程序会在磁盘上查找保存的程序集,加载该程序集,并从该程序集检索类型。 如果在调用时 GetType 程序集尚未保存到磁盘,该方法将 null返回。
GetType 不了解暂时性动态程序集;因此,调用 GetType 以检索暂时性动态程序集中的类型将 null返回。
在 .NET Framework 中,若要在动态模块上使用 GetType,请订阅 AppDomain.AssemblyResolve 事件,并在保存前调用 GetType。 否则,将在内存中获取程序集的两个副本。
在 .NET Core 3.0 及更高版本上,此 API 触发的程序集加载受当前值 AssemblyLoadContext.CurrentContextualReflectionContext 的影响。
该 throwOnError 参数指定在找不到类型时会发生什么情况,并取消某些其他异常条件,如“异常”部分中所述。 无论值如何 throwOnError,都会引发一些异常。 例如,如果找到类型但无法加载,则即使TypeLoadException为 throwOnError,也会引发 afalse。
下表显示了通过 Get 方法在反射类型时返回的基类成员。
| 成员类型 | Static | 非静态 |
|---|---|---|
| 构造函数 | 否 | 否 |
| 领域 | 否 | Yes. 字段始终是按名称和签名隐藏的。 |
| 事件 | 不適用 | 常见的类型系统规则是继承与实现属性的方法相同。 反射将属性视为按名称和签名隐藏。 请参阅下面的说明 2。 |
| 方法 | 否 | Yes. 方法(虚拟和非虚拟)可以按名称隐藏或按名称和签名隐藏。 |
| 嵌套类型 | 否 | 否 |
| 财产 | 不適用 | 常见的类型系统规则是继承与实现属性的方法相同。 反射将属性视为按名称和签名隐藏。 请参阅下面的说明 2。 |
按名称和签名隐藏会考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、sentinel 和非托管调用约定。 这是二进制比较。
对于反射,属性和事件通过名称和签名进行隐藏。 如果基类中同时具有 get 和 set 访问器的属性,但派生类只有 get 访问器,则派生类属性将隐藏基类属性,并且无法访问基类上的 setter。
自定义属性不是常见类型系统的一部分。
除非数组或 COM 类型已加载到可用类的表中,否则不会搜索它们。
typeName 可以是由其命名空间限定的类型名称,也可以是包含程序集名称规范的程序集限定名称。 请参阅 AssemblyQualifiedName。
如果 typeName 包含命名空间而不是程序集名称,则此方法按该顺序仅搜索调用对象的程序集并 mscorlib.dll/System.Private.CoreLib.dll。 如果使用部分或完整的程序集名称完全限定 typeName,此方法将在指定的程序集中搜索。 如果程序集具有强名称,则需要完整的程序集名称。
该 AssemblyQualifiedName 属性返回完全限定的类型名称,包括嵌套类型、程序集名称和泛型参数。 支持公共语言运行时的所有编译器都将发出嵌套类的简单名称,并且反射会根据以下约定在查询时构造一个混乱的名称。
注释
处理器体系结构是程序集标识的一部分,可以指定为程序集名称字符串的一部分。 例如,“ProcessorArchitecture=msil”。 但是,出于兼容性原因,它不包含在属性返回的 AssemblyQualifiedName 字符串中。 还可以通过创建对象 AssemblyName 并将其传递给方法的适当 Load 重载来加载类型。 然后,可以使用该方法 Assembly.GetType 从程序集加载类型。 另请参阅 AssemblyName.ProcessorArchitecture。
| 分隔符 | 含义 |
|---|---|
| 反斜杠 (\) | 转义字符。 |
| 反杆 (') | 位于泛型类型名称末尾的一个或多个表示类型参数数的数字之前。 |
| 方括号 ([]) | 为构造的泛型类型将泛型类型参数列表括起来;在类型参数列表中,将程序集限定的类型括起来。 |
| 逗号 (,) | 在程序集名称之前。 |
| 句点 (.) | 表示命名空间标识符。 |
| 加号 (+) | 在嵌套类之前。 |
例如,类的完全限定名称可能如下所示:
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
如果命名空间为 TopNamespace.Sub+Namespace,则字符串必须位于加号(+)前面,并带有转义字符(\),以防止将其解释为嵌套分隔符。 反射发出此字符串,如下所示:
TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly
“++”变为“\++”,“\”变为“\\”。
此限定名称可以持久保存,稍后用于加载 Type。 若要搜索和加载 a Type,请仅对类型名称或程序集限定类型名称使用 GetType 。 GetType 类型名称仅查找 Type 调用方程序集,然后在系统程序集中查找。 GetType 具有程序集限定类型名称的程序集将查找 Type 任何程序集。
类型名称可能包括表示有关类型的其他信息的尾随字符,例如类型是引用类型、指针类型还是数组类型。 若要检索没有这些尾随字符的类型名称,请使用 t.GetElementType().ToString(),其中的类型 t 。
空格与除程序集名称以外的所有类型名称组件相关。 在程序集名称中,“”分隔符之前的空格是相关的,但“,分隔符后面的空格将被忽略。
泛型类型的名称以反杆(')结尾,后跟表示泛型类型参数数的数字。 此名称管理的目的是允许编译器支持具有相同名称但类型参数数量不同的泛型类型,同时发生在同一范围内。 例如,反射从 Visual Basic 中的泛型方法Tuple`1和 Tuple`2 中的泛型方法返回Tuple(Of T)和 Tuple(Of T0, T1)的混乱名称,或Tuple<T>和 visual C# 中的 Tuple<T0, T1>。
对于泛型类型,类型参数列表括在括号中,类型参数用逗号分隔。 例如,泛型 Dictionary<TKey,TValue> 具有两个类型参数。 类型键的Dictionary<TKey,TValue>一个MyTypeString可能如下所示:
System.Collections.Generic.Dictionary`2[System.String,MyType]
若要在类型参数列表中指定程序集限定类型,请将程序集限定的类型括在括号内。 否则,分隔程序集限定名称部分的逗号将解释为分隔其他类型参数。 例如,一个Dictionary<TKey,TValue>MyType来自 MyAssembly.dll,其类型String为键,可能按如下所示指定:
Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
注释
仅当程序集限定类型出现在类型参数列表中时,才能将其括在括号中。 在类型参数列表中搜索限定和未限定类型的程序集的规则与限定和非限定的非泛型类型的规则相同。
可为 Null 的类型是泛型类型的特殊情况。 例如,可为 Int32 null 值由字符串“System.Nullable'1[System.Int32]”表示。
注释
还可以使用类型运算符获取可为 null 的类型。 例如,Visual Basic中的 Boolean 和 typeof(Nullable<bool>) 返回可为 null 的 GetType(Nullable(Of Boolean)) 类型。
下表显示了用于 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]]") |
另请参阅
- String
- TypeLoadException
- AssemblyQualifiedName
- GetAssembly(Type)
- GetType(String)
- AssemblyName
- 指定完全限定的类型名称
适用于
GetType(String, Boolean, Boolean)
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
获取 Type 具有指定名称的指定名称,指定在找不到类型时是否引发异常,以及是否执行区分大小写的搜索。
public:
static Type ^ GetType(System::String ^ typeName, bool throwOnError, bool ignoreCase);
public static Type GetType(string typeName, bool throwOnError, bool ignoreCase);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
public static Type? GetType(string typeName, bool throwOnError, bool ignoreCase);
public static Type? GetType(string typeName, bool throwOnError, bool ignoreCase);
static member GetType : string * bool * bool -> Type
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string * bool * bool -> Type
Public Shared Function GetType (typeName As String, throwOnError As Boolean, ignoreCase As Boolean) As Type
参数
- typeName
- String
要获取的类型的程序集限定名称。 请参阅 AssemblyQualifiedName。 如果类型位于当前正在执行的程序集或 mscorlib.dll/System.Private.CoreLib.dll中,则足以提供其命名空间限定的类型名称。
- throwOnError
- Boolean
true 如果找不到类型,则引发异常; falsenull返回 。 指定 false 还会禁止其他一些异常条件,但并非所有异常条件。 请参阅“异常”部分。
- ignoreCase
- Boolean
true 若要执行不区分大小写的搜索 typeName, false 则执行区分大小写的 typeName搜索。
返回
具有指定名称的类型。 如果未找到类型,则 throwOnError 参数指定是 null 返回还是引发异常。 在某些情况下,无论值如何 throwOnError,都会引发异常。 请参阅“异常”部分。
- 属性
例外
typeName 是 null。
调用类初始值设定项并引发异常。
throwOnError 是 true 且找不到类型。
-或-
throwOnError
true包含typeName无效字符,例如嵌入的选项卡。
-或-
throwOnError 是 true 空 typeName 字符串。
-或-
throwOnError表示truetypeName大小无效的数组类型。
-或-
typeName表示一个数组。TypedReference
throwOnError 是 true 且 typeName 包含无效语法。 例如,“MyType[,*,]”。
-或-
typeName 表示具有指针类型、 ByRef 类型或 Void 作为其类型参数之一的泛型类型。
-或-
typeName 表示具有错误数量的类型参数的泛型类型。
-或-
typeName 表示泛型类型,其类型参数之一不满足相应类型参数的约束。
throwOnError 是 true 并且找不到程序集或其依赖项之一。
找到程序集或其依赖项之一,但无法加载。
程序集对当前加载的运行时无效。
注解
如果知道其程序集限定名称,则可以使用 GetType 该方法获取另一 Type 个程序集中的类型的对象,该名称可从中 AssemblyQualifiedName获取。
GetType 导致加载在 . 中指定的 typeName程序集。 还可以使用 Assembly.Load 该方法加载程序集,然后使用 Assembly.GetType 或 Assembly.GetTypes 方法获取 Type 对象。 如果类型在编译时在程序已知的程序集中,则使用 C# 中的 typeof 或 Visual Basic 中的 GetType 运算符会更有效。
仅.NET框架:GetType仅适用于从磁盘加载的程序集。 如果调用 GetType 查找使用 System.Reflection.Emit 服务定义的动态程序集中定义的类型,则可能会出现不一致的行为。 此行为取决于动态程序集是永久性的,即使用RunAndSaveSave枚举的访问模式System.Reflection.Emit.AssemblyBuilderAccess创建的。 如果动态程序集是永久性的并且以前已写入磁盘 GetType ,则加载程序会在磁盘上查找保存的程序集,加载该程序集,并从该程序集检索类型。 如果在调用时 GetType 程序集尚未保存到磁盘,该方法将 null返回。
GetType 不了解暂时性动态程序集;因此,调用 GetType 以检索暂时性动态程序集中的类型将 null返回。
在 .NET Framework 中,若要在动态模块上使用 GetType,请订阅 AppDomain.AssemblyResolve 事件,并在保存前调用 GetType。 否则,将在内存中获取程序集的两个副本。
在 .NET Core 3.0 及更高版本上,此 API 触发的程序集加载受当前值 AssemblyLoadContext.CurrentContextualReflectionContext 的影响。
该 throwOnError 参数指定在找不到类型时会发生什么情况,并取消某些其他异常条件,如“异常”部分中所述。 无论值如何 throwOnError,都会引发一些异常。 例如,如果找到类型但无法加载,则即使TypeLoadException为 throwOnError,也会引发 afalse。
下表显示了通过 Get 方法在反射类型时返回的基类成员。
| 成员类型 | Static | 非静态 |
|---|---|---|
| 构造函数 | 否 | 否 |
| 领域 | 否 | Yes. 字段始终是按名称和签名隐藏的。 |
| 事件 | 不適用 | 常见的类型系统规则是继承与实现属性的方法相同。 反射将属性视为按名称和签名隐藏。 请参阅下面的说明 2。 |
| 方法 | 否 | Yes. 方法(虚拟和非虚拟)可以按名称隐藏或按名称和签名隐藏。 |
| 嵌套类型 | 否 | 否 |
| 财产 | 不適用 | 常见的类型系统规则是继承与实现属性的方法相同。 反射将属性视为按名称和签名隐藏。 请参阅下面的说明 2。 |
按名称和签名隐藏会考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、sentinel 和非托管调用约定。 这是二进制比较。
对于反射,属性和事件通过名称和签名进行隐藏。 如果基类中同时具有 get 和 set 访问器的属性,但派生类只有 get 访问器,则派生类属性将隐藏基类属性,并且无法访问基类上的 setter。
自定义属性不是常见类型系统的一部分。
除非数组或 COM 类型已加载到可用类的表中,否则不会搜索它们。
typeName 可以是由其命名空间限定的类型名称,也可以是包含程序集名称规范的程序集限定名称。 请参阅 AssemblyQualifiedName。
如果 typeName 包含命名空间而不是程序集名称,则此方法按该顺序仅搜索调用对象的程序集并 mscorlib.dll/System.Private.CoreLib.dll。 如果使用部分或完整的程序集名称完全限定 typeName,此方法将在指定的程序集中搜索。 如果程序集具有强名称,则需要完整的程序集名称。
该 AssemblyQualifiedName 属性返回完全限定的类型名称,包括嵌套类型、程序集名称和类型参数。 支持公共语言运行时的所有编译器都将发出嵌套类的简单名称,并且反射会根据以下约定在查询时构造一个混乱的名称。
注释
处理器体系结构是程序集标识的一部分,可以指定为程序集名称字符串的一部分。 例如,“ProcessorArchitecture=msil”。 但是,出于兼容性原因,它不包含在属性返回的 AssemblyQualifiedName 字符串中。 还可以通过创建对象 AssemblyName 并将其传递给方法的适当 Load 重载来加载类型。 然后,可以使用该方法 Assembly.GetType 从程序集加载类型。 另请参阅 AssemblyName.ProcessorArchitecture。
| 分隔符 | 含义 |
|---|---|
| 反斜杠 (\) | 转义字符。 |
| 反杆 (') | 位于泛型类型名称末尾的一个或多个表示类型参数数的数字之前。 |
| 方括号 ([]) | 为构造的泛型类型将泛型类型参数列表括起来;在类型参数列表中,将程序集限定的类型括起来。 |
| 逗号 (,) | 在程序集名称之前。 |
| 句点 (.) | 表示命名空间标识符。 |
| 加号 (+) | 在嵌套类之前。 |
例如,类的完全限定名称可能如下所示:
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
如果命名空间为 TopNamespace.Sub+Namespace,则字符串必须位于加号(+)前面,并带有转义字符(\),以防止将其解释为嵌套分隔符。 反射发出此字符串,如下所示:
TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly
“++”变为“\++”,“\”变为“\\”。
此限定名称可以持久保存,稍后用于加载 Type。 若要搜索和加载 a Type,请仅对类型名称或程序集限定类型名称使用 GetType 。 GetType 类型名称仅查找 Type 调用方程序集,然后在系统程序集中查找。 GetType 具有程序集限定类型名称的程序集将查找 Type 任何程序集。
类型名称可能包括表示有关类型的其他信息的尾随字符,例如类型是引用类型、指针类型还是数组类型。 若要检索没有这些尾随字符的类型名称,请使用 t.GetElementType().ToString(),其中的类型 t 。
空格与除程序集名称以外的所有类型名称组件相关。 在程序集名称中,“”分隔符之前的空格是相关的,但“,分隔符后面的空格将被忽略。
泛型类型的名称以反杆(')结尾,后跟表示泛型类型参数数的数字。 此名称管理的目的是允许编译器支持具有相同名称但类型参数数量不同的泛型类型,同时发生在同一范围内。 例如,反射从 Visual Basic 中的泛型方法Tuple`1和 Tuple`2 中的泛型方法返回Tuple(Of T)和 Tuple(Of T0, T1)的混乱名称,或Tuple<T>和 visual C# 中的 Tuple<T0, T1>。
对于泛型类型,类型参数列表括在括号中,类型参数用逗号分隔。 例如,泛型 Dictionary<TKey,TValue> 具有两个类型参数。 类型键的Dictionary<TKey,TValue>一个MyTypeString可能如下所示:
System.Collections.Generic.Dictionary`2[System.String,MyType]
若要在类型参数列表中指定程序集限定类型,请将程序集限定的类型括在括号内。 否则,分隔程序集限定名称部分的逗号将解释为分隔其他类型参数。 例如,一个Dictionary<TKey,TValue>MyType来自 MyAssembly.dll,其类型String为键,可能按如下所示指定:
Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
注释
仅当程序集限定类型出现在类型参数列表中时,才能将其括在括号中。 在类型参数列表中搜索限定和未限定类型的程序集的规则与限定和非限定的非泛型类型的规则相同。
可为 Null 的类型是泛型类型的特殊情况。 例如,可为 Int32 null 值由字符串“System.Nullable'1[System.Int32]”表示。
注释
还可以使用类型运算符获取可为 null 的类型。 例如,Visual Basic中的 Boolean 和 typeof(Nullable<bool>) 返回可为 null 的 GetType(Nullable(Of Boolean)) 类型。
下表显示了用于 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]]") |
另请参阅
- String
- TypeLoadException
- AssemblyQualifiedName
- GetAssembly(Type)
- GetType(String)
- AssemblyName
- 指定完全限定的类型名称
适用于
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>)
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
获取具有指定名称的类型,可以选择提供用于解析程序集和类型的自定义方法。
public:
static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
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);
public static Type? GetType(string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver);
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> -> Type
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
- String
要获取的类型的名称。 如果提供了参数 typeResolver ,则类型名称可以是能够解析的任何字符串 typeResolver 。
assemblyResolver如果提供了参数,或者如果使用标准类型解析,typeName则必须是程序集限定的名称(请参阅AssemblyQualifiedName),除非该类型位于当前正在执行的程序集或 mscorlib.dll/System.Private.CoreLib.dll中,在这种情况下,它足以提供其命名空间限定的类型名称。
- assemblyResolver
- Func<AssemblyName,Assembly>
一个查找并返回在 assemblyResolverAssemblyName对象传递给。 如果未 typeName 包含程序集的名称, assemblyResolver 则不调用。 如果未 assemblyResolver 提供,则执行标准程序集解析。
警告:不要从未知或不受信任的调用方传递方法。 这样做可能会导致恶意代码特权提升。 仅使用你提供或熟悉的方法。
一个方法,它查找并返回由 typeName 由标准程序集解析返回 assemblyResolver 的程序集中指定的类型。 如果未提供程序集,则 typeResolver 该方法可以提供一个程序集。 该方法还采用一个参数,指定是否执行不区分大小写的搜索; false 传递给该参数。
警告:不要从未知或不受信任的调用方传递方法。
返回
具有指定名称的类型,或者 null 找不到该类型。
- 属性
例外
typeName 是 null。
调用类初始值设定项并引发异常。
当分析为类型名称和程序集名称时 typeName (例如,当简单类型名称包含一个未转义的特殊字符时),将发生错误。
-或-
typeName 表示具有指针类型、 ByRef 类型或 Void 作为其类型参数之一的泛型类型。
-或-
typeName 表示具有错误数量的类型参数的泛型类型。
-或-
typeName 表示泛型类型,其类型参数之一不满足相应类型参数的约束。
typeName 表示无效类型,例如,一个数组 TypedReference。
程序集或其依赖项之一对当前加载的运行时无效。
注解
可以在方法重载中找到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)方法重载和指定falsethrowOnError和ignoreCase参数相同。
适用于
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
获取具有指定名称的类型,指定在找不到类型时是否引发异常,并选择性地提供自定义方法来解析程序集和类型。
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);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
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);
public static Type? GetType(string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver, bool throwOnError);
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool -> Type
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
- String
要获取的类型的名称。 如果提供了参数 typeResolver ,则类型名称可以是能够解析的任何字符串 typeResolver 。
assemblyResolver如果提供了参数,或者如果使用标准类型解析,typeName则必须是程序集限定的名称(请参阅AssemblyQualifiedName),除非该类型位于当前正在执行的程序集或 mscorlib.dll/System.Private.CoreLib.dll中,在这种情况下,它足以提供其命名空间限定的类型名称。
- assemblyResolver
- Func<AssemblyName,Assembly>
一个查找并返回在 assemblyResolverAssemblyName对象传递给。 如果未 typeName 包含程序集的名称, assemblyResolver 则不调用。 如果未 assemblyResolver 提供,则执行标准程序集解析。
警告:不要从未知或不受信任的调用方传递方法。 这样做可能会导致恶意代码特权提升。 仅使用你提供或熟悉的方法。
一个方法,它查找并返回由 typeName 由标准程序集解析返回 assemblyResolver 的程序集中指定的类型。 如果未提供程序集,则该方法可以提供一个程序集。 该方法还采用一个参数,指定是否执行不区分大小写的搜索; false 传递给该参数。
警告:不要从未知或不受信任的调用方传递方法。
- throwOnError
- Boolean
true 如果找不到类型,则引发异常; falsenull返回 。 指定 false 还会禁止其他一些异常条件,但并非所有异常条件。 请参阅“异常”部分。
返回
具有指定名称的类型。 如果未找到类型,则 throwOnError 参数指定是 null 返回还是引发异常。 在某些情况下,无论值如何 throwOnError,都会引发异常。 请参阅“异常”部分。
- 属性
例外
typeName 是 null。
调用类初始值设定项并引发异常。
throwOnError 是 true 且找不到类型。
-或-
throwOnError
true包含typeName无效字符,例如嵌入的选项卡。
-或-
throwOnError 是 true 空 typeName 字符串。
-或-
throwOnError表示truetypeName大小无效的数组类型。
-或-
typeName表示一个数组。TypedReference
当分析为类型名称和程序集名称时 typeName (例如,当简单类型名称包含一个未转义的特殊字符时),将发生错误。
-或-
throwOnError 是 true 并 typeName 包含无效的语法(例如,“MyType[,*,]”)。
-或-
typeName 表示具有指针类型、 ByRef 类型或 Void 作为其类型参数之一的泛型类型。
-或-
typeName 表示具有错误数量的类型参数的泛型类型。
-或-
typeName 表示泛型类型,其类型参数之一不满足相应类型参数的约束。
throwOnError 是 true 并且找不到程序集或其依赖项之一。
-或-
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参数相同。
适用于
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean)
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
- Source:
- Type.CoreCLR.cs
获取具有指定名称的类型,指定是否执行区分大小写的搜索,以及是否在找不到类型时引发异常,还可以选择提供自定义方法来解析程序集和类型。
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);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")]
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);
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);
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("The type might be removed")>]
static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool * bool -> Type
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
- String
要获取的类型的名称。 如果提供了参数 typeResolver ,则类型名称可以是能够解析的任何字符串 typeResolver 。
assemblyResolver如果提供了参数,或者如果使用标准类型解析,typeName则必须是程序集限定的名称(请参阅AssemblyQualifiedName),除非该类型位于当前正在执行的程序集或 mscorlib.dll/System.Private.CoreLib.dll中,在这种情况下,它足以提供其命名空间限定的类型名称。
- assemblyResolver
- Func<AssemblyName,Assembly>
一个查找并返回在 assemblyResolverAssemblyName对象传递给。 如果未 typeName 包含程序集的名称, assemblyResolver 则不调用。 如果未 assemblyResolver 提供,则执行标准程序集解析。
警告:不要从未知或不受信任的调用方传递方法。 这样做可能会导致恶意代码特权提升。 仅使用你提供或熟悉的方法。
一个方法,它查找并返回由 typeName 由标准程序集解析返回 assemblyResolver 的程序集中指定的类型。 如果未提供程序集,则该方法可以提供一个程序集。 该方法还采用一个参数,指定是否执行不区分大小写的搜索; ignoreCase 值传递给该参数。
警告:不要从未知或不受信任的调用方传递方法。
- throwOnError
- Boolean
true 如果找不到类型,则引发异常; falsenull返回 。 指定 false 还会禁止其他一些异常条件,但并非所有异常条件。 请参阅“异常”部分。
- ignoreCase
- Boolean
true 若要执行不区分大小写的搜索 typeName, false 则执行区分大小写的 typeName搜索。
返回
具有指定名称的类型。 如果未找到类型,则 throwOnError 参数指定是 null 返回还是引发异常。 在某些情况下,无论值如何 throwOnError,都会引发异常。 请参阅“异常”部分。
- 属性
例外
typeName 是 null。
调用类初始值设定项并引发异常。
throwOnError 是 true 且找不到类型。
-或-
throwOnError
true包含typeName无效字符,例如嵌入的选项卡。
-或-
throwOnError 是 true 空 typeName 字符串。
-或-
throwOnError表示truetypeName大小无效的数组类型。
-或-
typeName表示一个数组。TypedReference
当分析为类型名称和程序集名称时 typeName (例如,当简单类型名称包含一个未转义的特殊字符时),将发生错误。
-或-
throwOnError 是 true 并 typeName 包含无效的语法(例如,“MyType[,*,]”)。
-或-
typeName 表示具有指针类型、 ByRef 类型或 Void 作为其类型参数之一的泛型类型。
-或-
typeName 表示具有错误数量的类型参数的泛型类型。
-或-
typeName 表示泛型类型,其类型参数之一不满足相应类型参数的约束。
throwOnError 是 true 并且找不到程序集或其依赖项之一。
程序集或其依赖项之一不是当前加载的运行时的有效程序集。
注解
在 .NET Core 3.0 及更高版本上,如果 assemblyResolver 为 null,则此 API 触发的程序集加载受当前值 AssemblyLoadContext.CurrentContextualReflectionContext 的影响。
利用GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean)方法重载及其关联的重载(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。 仅使用你提供或熟悉的方法。Caution
使用未知或不受信任的调用方的方法可能会导致恶意代码特权提升。
如果省略
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 则以递归方式调用以解析其类型参数,依此类推。
你提供的组合assemblyResolvertypeResolver必须能够解析此递归的所有级别。 例如,假设提供一个用于控制 assemblyResolver 加载的 MyAssembly。 假设你想要解析泛型类型 Dictionary<string, MyType> (Dictionary(Of String, MyType) 在 Visual Basic 中)。 可能会传递以下泛型类型名称:
"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)
);
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)
else
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 将以递归方式被调用,因此它必须能够处理这种情况。 现在,它使用提供的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
);
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)
else
assem.GetType(name, false, ignr)), true)
解析具有特殊字符的类型名称
某些字符在程序集限定名称中具有特殊含义。 如果简单类型名称包含这些字符,则当简单名称是程序集限定名称的一部分时,这些字符会导致分析错误。 若要避免分析错误,必须使用反斜杠转义特殊字符,然后才能将程序集限定名称传递给 GetType 方法。 例如,如果一个类型被命名为Strange]Type,则必须在方括号之前添加转义字符,如下所示:Strange\]Type
注释
不能在 Visual Basic 或 C# 中创建具有此类特殊字符的名称,但可以使用公共中间语言(CIL)或发出动态程序集来创建。
下表显示了类型名称的特殊字符。
| 字符 | 含义 |
|---|---|
, (逗号) |
程序集限定名称的分隔符。 |
[] (方括号) |
作为后缀对,指示数组类型;作为分隔符对,将泛型参数列表和程序集限定的名称括起来。 |
&(与号) |
指示类型为引用类型的后缀。 |
*(星号) |
指示类型为指针类型的后缀。 |
+(加) |
嵌套类型的分隔符。 |
\ (反斜杠) |
转义字符。 |
AssemblyQualifiedName 等属性会返回正确转义的字符串。 必须将正确转义的字符串传递给 GetType 方法。 反过来,GetType 方法会将正确转义的名称传递给 typeResolver 以及默认类型解析方法。 如果需将名称与 typeResolver 中的未转义名称进行比较,则必须删除转义字符。
混合名称解析
下表汇总了在assemblyResolver、typeResolver 和默认名称解析之间针对 typeName 中类型名称与程序集名称的所有组合的交互。
| 类型名称的内容 | 程序集解析程序方法 | 类型解析程序方法 | Result |
|---|---|---|---|
| 类型、组装 | 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,并且不会进一步尝试解析该类型。 |
| 类型 | null,已提供 | null | 等效于调用 Type.GetType(String, Boolean, Boolean) 方法重载。 由于未提供程序集名称,因此只搜索 mscorlib.dll/System.Private.CoreLib.dll 和当前正在执行的程序集。 如果 assemblyResolver 已提供,则忽略它。 |
| 类型 | null,已提供 | 已提供 |
typeResolver 被调用,并且 null 被传递给程序集。
typeResolver 可以从任何程序集提供类型,包括它为此加载的程序集。 如果 assemblyResolver 已提供,则忽略它。 |
| 程序集 | null,已提供 | null,已提供 | 抛出 FileLoadException,因为程序集名称被解析得似乎是程序集限定的类型名称。 这会导致程序集名称无效。 |