Type.GetType 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
获取表示指定类型的 Type 对象。
重载
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) |
获取具有指定名称的类型,指定是否执行区分大小写的搜索,在找不到类型时是否引发异常,(可选)提供自定义方法以解析程序集和该类型。 |
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)
- 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);
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
- String
要获取的类型的名称。 如果提供了 typeResolver
参数,则类型名称可以为 typeResolver
能够解析的任何字符串。
assemblyResolver
如果提供了参数或使用了标准类型解析,typeName
则必须是程序集限定的名称 (请参阅 AssemblyQualifiedName) ,除非类型位于当前正在执行的程序集或 mscorlib.dll/System.Private.CoreLib.dll 中,在这种情况下,足以提供由其命名空间限定的类型名称。
- assemblyResolver
- Func<AssemblyName,Assembly>
一个方法,它定位并返回 typeName
中指定的程序集。 以 assemblyResolver
对象形式传递给 AssemblyName 的程序集名称。 如果 typeName
不包含程序集的名称,则不调用 assemblyResolver
。 如果未提供 assemblyResolver
,则执行标准程序集解析。
警告:不要从未知或不受信任的调用方传递方法。 此操作可能会导致恶意代码特权提升。 仅使用你提供或者熟悉的方法。
一个方法,它在由 typeName
或标准程序集解析返回的程序集中定位并返回 assemblyResolver
所指定的类型。 如果未提供任何程序集,则该方法可以提供一个程序集。 该方法还采用一个参数以指定是否执行不区分大小写的搜索;ignoreCase
的值传递给该参数。
警告:不要从未知或不受信任的调用方传递方法。
- throwOnError
- Boolean
如果为 true
,则在找不到该类型时引发异常;如果为 false
,则返回 null
。 指定 false
还会取消某些其他异常条件,但并不取消所有条件。 请参见“异常”部分。
- ignoreCase
- Boolean
对 true
执行的搜索不区分大小写,则为 typeName
;对 false
执行的搜索区分大小写,则为 typeName
。
返回
具有指定名称的类型。 如果找不到该类型,则 throwOnError
参数指定是返回 null
还是引发异常。 在某些情况下,将引发异常,而不考虑 throwOnError
的值。 请参见“异常”部分。
例外
typeName
为 null
。
调用了类初始值设定项,且该项引发了异常。
throwOnError
是 true
,且找不到该类型。
或
throwOnError
的值为 true
,且 typeName
包含无效字符,例如嵌入的制表符。
或
throwOnError
的值为 true
,且 typeName
为空字符串。
或
throwOnError
的值为 true
,且 typeName
表示大小无效的数组类型。
或
typeName
表示 TypedReference 的数组。
当 typeName
解析为类型名称和程序集名称时(例如,当简单类型名称包含未转义的特殊字符时),发生错误。
或
throwOnError
是 true
,且 typeName
包含无效的语法(例如 "MyType[,*,]")。
或
typeName
表示将指针类型、ByRef
类型或 Void 作为其类型参数之一的泛型类型。
或
typeName
表示具有错误的类型参数数目的泛型类型。
或
typeName
表示泛型类型,并且其类型参数之一不满足相应类型参数的约束。
throwOnError
的值为 true
,且未找到程序集或程序集的某个依赖项。
程序集或其依赖项之一不是当前加载的运行时的有效程序集。
注解
有关此 API 的详细信息,请参阅 Type.GetType 的补充 API 说明。
适用于
GetType()
GetType(String)
- 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);
public static Type? GetType (string typeName);
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。
找到了程序集或其依赖项之一,但无法加载它们。
注意:在 .NET for Windows 应用商店应用 或 可移植类库中,请改为捕获基类异常 IOException。
程序集对当前加载的运行时无效。
示例
以下示例检索 的类型 System.Int32
,并使用该类型对象显示 FullName 的 System.Int32
属性。
using namespace System;
int 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
using System;
class Example
{
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
注解
如果知道另一个Type程序集中的某个类型的对象,则可以使用 GetType 方法获取其程序集限定名称(可从 获取AssemblyQualifiedName)。
GetType 导致加载 中指定的 typeName
程序集。 还可以使用 Assembly.Load 方法加载程序集,然后使用 Assembly.GetType 或 Assembly.GetTypes 方法获取 Type 对象。 如果在编译时程序已知的程序集中某个类型,则使用 C# 或 GetType
Visual Basic 中的 运算符会更有效typeof
。
注意
如果 typeName
找不到 ,则对 方法的 GetType(String) 调用将返回 null
。 它不会引发异常。 若要控制是否引发异常,请调用具有 throwOnError
参数的方法的GetType重载。
GetType 仅适用于从磁盘加载的程序集。 如果调用 GetType 以查找在使用 System.Reflection.Emit 服务定义的动态程序集中定义的类型,则可能会出现不一致的行为。 该行为取决于动态程序集是否是永久性的,即使用 RunAndSave
枚举的 System.Reflection.Emit.AssemblyBuilderAccess 或 Save
访问模式创建的。 如果动态程序集是永久性的,并且已在调用 之前 GetType
写入磁盘,则加载程序将在磁盘上查找保存的程序集,加载该程序集,并从该程序集检索类型。 如果在调用 时 GetType
程序集尚未保存到磁盘,则 方法返回 null
。
GetType
不了解暂时性动态程序集;因此,调用 GetType
以检索暂时性动态程序集中的类型将 null
返回 。
若要在动态模块上使用 GetType
,请订阅 事件并在 AppDomain.AssemblyResolve 保存之前调用 GetType
。 否则,将在内存中获取程序集的两个副本。
下表显示了在对类型进行反射时方法返回 Get
的基类成员。
成员类型 | 静态 | 非静态 |
---|---|---|
构造函数 | 否 | 否 |
字段 | 否 | 可以。 字段始终按名称和签名隐藏。 |
事件 | 不适用 | 常见类型系统规则是继承与实现 属性的方法的继承相同。 反射将属性视为按名称和签名隐藏。 请参阅下面的注释 2。 |
方法 | 否 | 可以。 (虚拟和非虚拟) 的方法可以是按名称隐藏或按名称和签名隐藏。 |
嵌套类型 | 否 | 否 |
properties | 不适用 | 常见类型系统规则是继承与实现 属性的方法的继承相同。 反射将属性视为按名称和签名隐藏。 请参阅下面的注释 2。 |
按名称和签名隐藏考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、sentinels 和非托管调用约定。 这是二进制比较。
对于反射,属性和事件按名称和签名隐藏。 如果在基类中具有同时具有 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。 若要搜索和加载 Type,请 GetType 仅将 与类型名称一起使用,或与程序集限定的类型名称一起使用。 GetType 具有类型名称的 将在调用方程序集中查找 Type ,然后在系统程序集中查找 。 GetType 具有程序集限定的类型名称将在任何程序集中查找 Type 。
类型名称可能包含表示有关类型的其他信息的尾随字符,例如类型是引用类型、指针类型还是数组类型。 若要检索不包含这些尾随字符的类型名称,请使用 t.GetElementType().ToString()
,其中 t
是 类型。
空格与除程序集名称以外的所有类型名称组件相关。 在程序集名称中,“,”分隔符前的空格是相关的,但“,”分隔符后面的空格将被忽略。
泛型类型的名称以反引号结尾, (') 后跟表示泛型类型参数数的数字。 此名称整型的目的是允许编译器支持同名但类型参数数量不同(发生在同一范围内)的泛型类型。 例如,反射在 Visual Basic 中或 Visual C# 中返回泛型方法Tuple(Of T)
中的 和 中经过整型的名称 Tuple`2
Tuple`1
和 Tuple<T0, T1>
Tuple(Of T0, T1)
。Tuple<T>
对于泛型类型,类型参数列表用方括号括起来,类型参数用逗号分隔。 例如,泛型 Dictionary<TKey,TValue> 有两个类型参数。
Dictionary<TKey,TValue>
MyType
具有 类型的String键的 的 可能表示如下:
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 的类型是泛型类型的一种特例。 例如,可为 null 的 Int32 由字符串“System.Nullable'1[System.Int32]”表示。
注意
在 C#、C++ 和 Visual Basic 中,还可以使用类型运算符获取可为 null 的类型。 例如,可为 null 的类型 Boolean 在 C# 中 返回 typeof(Nullable<bool>)
,在 C++ 中返回 by Nullable<Boolean>::typeid
,在 Visual Basic 中返回 by 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
获取具有指定名称的 Type,指定是否执行区分大小写的搜索,以及在找不到类型时是否引发异常。
public:
static Type ^ GetType(System::String ^ typeName, bool throwOnError);
public static Type GetType (string typeName, bool throwOnError);
public static Type? GetType (string typeName, bool throwOnError);
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
,则在找不到该类型时引发异常;如果为 false
,则返回 null
。 指定 false
还会取消某些其他异常条件,但并不取消所有条件。 请参见“异常”部分。
返回
具有指定名称的类型。 如果找不到该类型,则 throwOnError
参数指定是返回 null
还是引发异常。 在某些情况下,将引发异常,而不考虑 throwOnError
的值。 请参见“异常”部分。
例外
typeName
为 null
。
调用了类初始值设定项,且该项引发了异常。
throwOnError
是 true
,且找不到该类型。
或
throwOnError
的值为 true
,且 typeName
包含无效字符,例如嵌入的制表符。
或
throwOnError
的值为 true
,且 typeName
为空字符串。
或
throwOnError
的值为 true
,且 typeName
表示大小无效的数组类型。
或
typeName
表示 TypedReference 的数组。
throwOnError
是 true
,且 typeName
包含无效的语法。 例如:"MyType[,*,]"。
或
typeName
表示将指针类型、ByRef
类型或 Void 作为其类型参数之一的泛型类型。
或
typeName
表示具有错误的类型参数数目的泛型类型。
或
typeName
表示泛型类型,并且其类型参数之一不满足相应类型参数的约束。
throwOnError
的值为 true
,且未找到程序集或程序集的某个依赖项。
找到了程序集或其依赖项之一,但无法加载它们。
注意:在 适用于 Windows 应用商店应用的 .NET 或 可移植类库中,改为捕获基类异常 IOException。
程序集或其依赖项之一对当前加载的运行时无效。
示例
以下示例检索 的类型 System.Int32
,并使用该类型对象显示 FullName 的 System.Int32
属性。 如果类型对象引用不存在的程序集,则此示例将引发异常。
using namespace System;
int 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
using System;
class Example
{
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
注解
如果知道另一个Type程序集中的类型具有程序集限定的名称(可从 获取),则可以使用 GetType 方法获取AssemblyQualifiedName该类型的对象。
GetType 导致加载 中指定的 typeName
程序集。 还可以使用 Assembly.Load 方法加载程序集,然后使用 Assembly.GetType 或 Assembly.GetTypes 方法获取 Type 对象。 如果类型在编译时位于程序已知的程序集中,则使用 C# 或 GetType
Visual Basic 中的 运算符会更有效typeof
。
GetType
仅适用于从磁盘加载的程序集。 如果调用 GetType
以查找在使用 System.Reflection.Emit 服务定义的动态程序集中定义的类型,可能会出现不一致的行为。 该行为取决于动态程序集是否是永久性的,即使用 RunAndSave
枚举的 System.Reflection.Emit.AssemblyBuilderAccess 或 Save
访问模式创建的。 如果动态程序集是永久性的,并且已在调用 之前 GetType
写入磁盘,则加载程序将在磁盘上查找保存的程序集,加载该程序集,并从该程序集检索类型。 如果在调用 时 GetType
程序集尚未保存到磁盘,则该方法返回 null
。
GetType
不了解暂时性动态程序集;因此,调用 GetType
以检索暂时性动态程序集中的类型将 null
返回 。
若要在动态模块上使用 GetType
,请订阅 事件并在 AppDomain.AssemblyResolve 保存之前调用 GetType
。 否则,将在内存中获取程序集的两个副本。
参数 throwOnError
指定找不到类型时会发生什么情况,还禁止某些其他异常条件,如异常部分中所述。 无论 的值 throwOnError
如何,都会引发一些异常。 例如,如果找到类型但无法加载, TypeLoadException 则即使 throwOnError
为 false
,也会引发 。
下表显示了在对类型进行反射时方法返回 Get
的基类成员。
成员类型 | 静态 | 非静态 |
---|---|---|
构造函数 | 否 | 否 |
字段 | 否 | 可以。 字段始终按名称和签名隐藏。 |
事件 | 不适用 | 常见类型系统规则是继承与实现 属性的方法的继承相同。 反射将属性视为按名称和签名隐藏。 请参阅下面的注释 2。 |
方法 | 否 | 可以。 (虚拟和非虚拟) 的方法可以是按名称隐藏或按名称和签名隐藏。 |
嵌套类型 | 否 | 否 |
properties | 不适用 | 常见类型系统规则是继承与实现 属性的方法的继承相同。 反射将属性视为按名称和签名隐藏。 请参阅下面的注释 2。 |
按名称和签名隐藏考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、sentinels 和非托管调用约定。 这是二进制比较。
对于反射,属性和事件按名称和签名隐藏。 如果在基类中具有同时具有 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。 若要搜索和加载 Type,请 GetType 仅将 与类型名称一起使用,或与程序集限定的类型名称一起使用。 GetType 具有类型名称的 将在调用方程序集中查找 Type ,然后在系统程序集中查找 。 GetType 具有程序集限定的类型名称将在任何程序集中查找 Type 。
类型名称可能包含表示有关类型的其他信息的尾随字符,例如类型是引用类型、指针类型还是数组类型。 若要检索不包含这些尾随字符的类型名称,请使用 t.GetElementType().ToString()
,其中 t
是 类型。
空格与除程序集名称以外的所有类型名称组件相关。 在程序集名称中,“,”分隔符前的空格是相关的,但“,”分隔符后面的空格将被忽略。
泛型类型的名称以反引号结尾, (') 后跟表示泛型类型参数数的数字。 此名称整型的目的是允许编译器支持同名但类型参数数量不同(发生在同一范围内)的泛型类型。 例如,反射在 Visual Basic 中或 Visual C# 中返回泛型方法Tuple(Of T)
中的 和 中经过整型的名称 Tuple`2
Tuple`1
和 Tuple<T0, T1>
Tuple(Of T0, T1)
。Tuple<T>
对于泛型类型,类型参数列表用方括号括起来,类型参数用逗号分隔。 例如,泛型 Dictionary<TKey,TValue> 有两个类型参数。
Dictionary<TKey,TValue>
MyType
具有 类型的String键的 的 可能表示如下:
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 的类型是泛型类型的一种特例。 例如,可为 null 的 Int32 由字符串“System.Nullable'1[System.Int32]”表示。
注意
在 C#、C++ 和 Visual Basic 中,还可以使用类型运算符获取可为 null 的类型。 例如,可为 null 的类型 Boolean 在 C# 中 返回 typeof(Nullable<bool>)
,在 C++ 中返回 by Nullable<Boolean>::typeid
,在 Visual Basic 中返回 by 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
获取具有指定名称的 Type,指定是否执行区分大小写的搜索,以及在找不到类型时是否引发异常。
public:
static Type ^ GetType(System::String ^ typeName, bool throwOnError, bool ignoreCase);
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
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
,则在找不到该类型时引发异常;如果为 false
,则返回 null
。 指定 false
还会取消某些其他异常条件,但并不取消所有条件。 请参见“异常”部分。
- ignoreCase
- Boolean
对 true
执行的搜索不区分大小写,则为 typeName
;对 false
执行的搜索区分大小写,则为 typeName
。
返回
具有指定名称的类型。 如果找不到该类型,则 throwOnError
参数指定是返回 null
还是引发异常。 在某些情况下,将引发异常,而不考虑 throwOnError
的值。 请参见“异常”部分。
例外
typeName
为 null
。
调用了类初始值设定项,且该项引发了异常。
throwOnError
是 true
,且找不到该类型。
或
throwOnError
的值为 true
,且 typeName
包含无效字符,例如嵌入的制表符。
或
throwOnError
的值为 true
,且 typeName
为空字符串。
或
throwOnError
的值为 true
,且 typeName
表示大小无效的数组类型。
或
typeName
表示 TypedReference 的数组。
throwOnError
是 true
,且 typeName
包含无效的语法。 例如:"MyType[,*,]"。
或
typeName
表示将指针类型、ByRef
类型或 Void 作为其类型参数之一的泛型类型。
或
typeName
表示具有错误的类型参数数目的泛型类型。
或
typeName
表示泛型类型,并且其类型参数之一不满足相应类型参数的约束。
throwOnError
的值为 true
,且未找到程序集或程序集的某个依赖项。
找到了程序集或其依赖项之一,但无法加载它们。
程序集对当前加载的运行时无效。
注解
如果知道另一个Type程序集中的类型具有程序集限定的名称(可从 获取),则可以使用 GetType 方法获取AssemblyQualifiedName该类型的对象。
GetType 导致加载 中指定的 typeName
程序集。 还可以使用 Assembly.Load 方法加载程序集,然后使用 Assembly.GetType 或 Assembly.GetTypes 方法获取 Type 对象。 如果类型在编译时位于程序已知的程序集中,则使用 C# 或 GetType
Visual Basic 中的 运算符会更有效typeof
。
GetType
仅适用于从磁盘加载的程序集。 如果调用 GetType
以查找在使用 System.Reflection.Emit 服务定义的动态程序集中定义的类型,可能会出现不一致的行为。 该行为取决于动态程序集是否是永久性的,即使用 RunAndSave
枚举的 System.Reflection.Emit.AssemblyBuilderAccess 或 Save
访问模式创建的。 如果动态程序集是永久性的,并且已在调用 之前 GetType
写入磁盘,则加载程序将在磁盘上查找保存的程序集,加载该程序集,并从该程序集检索类型。 如果在调用 时 GetType
程序集尚未保存到磁盘,则该方法返回 null
。
GetType
不了解暂时性动态程序集;因此,调用 GetType
以检索暂时性动态程序集中的类型将 null
返回 。
若要在动态模块上使用 GetType
,请订阅 事件并在 AppDomain.AssemblyResolve 保存之前调用 GetType
。 否则,将在内存中获取程序集的两个副本。
参数 throwOnError
指定找不到类型时会发生什么情况,还禁止某些其他异常条件,如异常部分中所述。 无论 的值 throwOnError
如何,都会引发一些异常。 例如,如果找到类型但无法加载, TypeLoadException 则即使 throwOnError
为 false
,也会引发 。
下表显示了在对类型进行反射时方法返回 Get
的基类成员。
成员类型 | 静态 | 非静态 |
---|---|---|
构造函数 | 否 | 否 |
字段 | 否 | 可以。 字段始终按名称和签名隐藏。 |
事件 | 不适用 | 常见类型系统规则是继承与实现 属性的方法的继承相同。 反射将属性视为按名称和签名隐藏。 请参阅下面的注释 2。 |
方法 | 否 | 可以。 (虚拟和非虚拟) 的方法可以是按名称隐藏或按名称和签名隐藏。 |
嵌套类型 | 否 | 否 |
properties | 不适用 | 常见类型系统规则是继承与实现 属性的方法的继承相同。 反射将属性视为按名称和签名隐藏。 请参阅下面的注释 2。 |
按名称和签名隐藏考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、sentinels 和非托管调用约定。 这是二进制比较。
对于反射,属性和事件按名称和签名隐藏。 如果在基类中具有同时具有 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。 若要搜索和加载 Type,请 GetType 仅将 与类型名称一起使用,或与程序集限定的类型名称一起使用。 GetType 具有类型名称的 将在调用方程序集中查找 Type ,然后在系统程序集中查找 。 GetType 具有程序集限定的类型名称将在任何程序集中查找 Type 。
类型名称可能包含表示有关类型的其他信息的尾随字符,例如类型是引用类型、指针类型还是数组类型。 若要检索不包含这些尾随字符的类型名称,请使用 t.GetElementType().ToString()
,其中 t
是 类型。
空格与除程序集名称以外的所有类型名称组件相关。 在程序集名称中,“,”分隔符前的空格是相关的,但“,”分隔符后面的空格将被忽略。
泛型类型的名称以反引号 (') 结尾,后跟表示泛型类型参数数的数字。 此名称整型的目的是允许编译器支持同名但类型参数数量不同的泛型类型,这些类型参数在同一范围内发生。 例如,反射从泛型方法和 Tuple(Of T0, T1)
Visual Basic Tuple<T>
或 Visual C# 中的 和 返回经过修改的名称Tuple`1
Tuple`2
和Tuple<T0, T1>
。Tuple(Of T)
对于泛型类型,类型参数列表用方括号括起来,类型参数用逗号分隔。 例如,泛型 Dictionary<TKey,TValue> 有两个类型参数。
Dictionary<TKey,TValue>
MyType
具有 类型String键的 ,可以按如下所示表示:
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 的类型是泛型类型的特例。 例如,可为 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
。
获取 | 使用 |
---|---|
可为 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
获取具有指定名称的类型,(可选)提供自定义方法以解析程序集和该类型。
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
- String
要获取的类型的名称。 如果提供了 typeResolver
参数,则类型名称可以为 typeResolver
能够解析的任何字符串。
assemblyResolver
如果提供了参数或使用了标准类型解析,typeName
则必须是程序集限定的名称 (请参阅 AssemblyQualifiedName) ,除非类型位于当前正在执行的程序集或 mscorlib.dll/System.Private.CoreLib.dll 中,在这种情况下,足以提供由其命名空间限定的类型名称。
- assemblyResolver
- Func<AssemblyName,Assembly>
一个方法,它定位并返回 typeName
中指定的程序集。 以 assemblyResolver
对象形式传递给 AssemblyName 的程序集名称。 如果 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
。 它不会引发异常。 若要控制是否引发异常,请调用具有 throwOnError
参数的方法的GetType重载。
调用此方法重载与调用 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) 方法重载并指定 false
throwOnError
和 ignoreCase
参数相同。
适用于
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)
- 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);
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
- String
要获取的类型的名称。 如果提供了 typeResolver
参数,则类型名称可以为 typeResolver
能够解析的任何字符串。
assemblyResolver
如果提供了参数或使用了标准类型解析,typeName
则必须是程序集限定的名称 (请参阅 AssemblyQualifiedName) ,除非类型位于当前正在执行的程序集或 mscorlib.dll/System.Private.CoreLib.dll 中,在这种情况下,足以提供由其命名空间限定的类型名称。
- assemblyResolver
- Func<AssemblyName,Assembly>
一个方法,它定位并返回 typeName
中指定的程序集。 以 assemblyResolver
对象形式传递给 AssemblyName 的程序集名称。 如果 typeName
不包含程序集的名称,则不调用 assemblyResolver
。 如果未提供 assemblyResolver
,则执行标准程序集解析。
警告:不要从未知或不受信任的调用方传递方法。 此操作可能会导致恶意代码特权提升。 仅使用你提供或者熟悉的方法。
一个方法,它在由 typeName
或标准程序集解析返回的程序集中定位并返回 assemblyResolver
所指定的类型。 如果未提供任何程序集,则该方法可以提供一个程序集。 该方法还采用一个参数以指定是否执行不区分大小写的搜索;false
传递给该参数。
警告:不要从未知或不受信任的调用方传递方法。
- throwOnError
- Boolean
如果为 true
,则在找不到该类型时引发异常;如果为 false
,则返回 null
。 指定 false
还会取消某些其他异常条件,但并不取消所有条件。 请参见“异常”部分。
返回
具有指定名称的类型。 如果找不到该类型,则 throwOnError
参数指定是返回 null
还是引发异常。 在某些情况下,将引发异常,而不考虑 throwOnError
的值。 请参见“异常”部分。
例外
typeName
为 null
。
调用了类初始值设定项,且该项引发了异常。
throwOnError
是 true
,且找不到该类型。
或
throwOnError
的值为 true
,且 typeName
包含无效字符,例如嵌入的制表符。
或
throwOnError
的值为 true
,且 typeName
为空字符串。
或
throwOnError
的值为 true
,且 typeName
表示大小无效的数组类型。
或
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)方法重载并指定false
ignoreCase
参数相同。