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()
GetType(String)
获取具有指定名称的 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 Store 应用或可移植类库中,改为捕获基类 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
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
GetType
运算符Visual Basic。
备注
如果 typeName
找不到 ,则对 方法的 GetType(String) 调用将返回 null
。 它不会引发异常。 若要控制是否引发异常,请调用 GetType 具有 参数的方法的 throwOnError
重载。
GetType 仅适用于从磁盘加载的程序集。 如果调用 GetType 查找使用 服务定义的动态程序集中定义的类型 System.Reflection.Emit ,则可能会获得不一致的行为。 行为取决于动态程序集是持久性的,即使用 枚举的 RunAndSave
或 访问 Save
模式 System.Reflection.Emit.AssemblyBuilderAccess 创建的。 如果动态程序集是持久性的,并且已在调用 之前写入磁盘,则加载程序在磁盘上查找保存的程序集,加载该程序集,然后从该程序集 GetType
检索类型。 如果在调用 时程序集尚未保存到磁盘 GetType
,则 方法返回 null
。 GetType
不了解暂时性动态程序集;因此, GetType
调用 以检索暂时性动态程序集中的类型将返回 null
。
若要在 GetType
动态模块上使用 ,请订阅 AppDomain.AssemblyResolve 事件并调用 , GetType
然后再保存。 否则,将在内存中获取程序集的两个副本。
下表显示了在类型上反射时,方法返回的基 Get
类的成员。
成员类型 | 静态 | 非静态 |
---|---|---|
构造函数 | 否 | 否 |
字段 | 否 | 可以。 字段始终按名称和签名进行隐藏。 |
事件 | 不适用 | 常见类型系统规则是继承与实现 属性的方法的继承相同。 反射将属性视为按名称和签名进行隐藏。 请参阅下面的注释 2。 |
方法 | 否 | 可以。 一 (虚拟和非虚拟) 可以按名称隐藏,也可以按名称和签名进行隐藏。 |
嵌套类型 | 否 | 否 |
properties | 不适用 | 常见类型系统规则是继承与实现 属性的方法的继承相同。 反射将属性视为按名称和签名进行隐藏。 请参阅下面的注释 2。 |
"按名称隐藏"和"签名"考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、sentinels 以及非托管调用约定。 这是二进制比较。
对于反射,属性和事件按名称和签名进行隐藏。 如果属性在基类中同时具有 get 和 set 访问器,但派生类只有 get 访问器,则派生类属性将隐藏基类属性,并且你将无法访问基类上的 setter。
自定义属性不是通用类型系统的一部分。
除非数组或 COM 类型已加载到可用类的表中,否则不会搜索它们。
typeName
可以是由命名空间限定的类型名称,或者是包含程序集名称规范的程序集限定名称。 请参阅 AssemblyQualifiedName。
如果 包含 命名空间,但不包括程序集名称,则此方法仅搜索调用对象的程序集,mscorlib.dlltypeName
/System.Private.CoreLib.dll 按该顺序搜索 。 如果使用部分或完整程序集名称完全限定 typeName,则此方法将搜索指定的程序集。 如果程序集具有强名称,则要求使用完整的程序集名称。
属性 AssemblyQualifiedName 返回完全限定的类型名称,包括嵌套类型、程序集名称和泛型类型参数。 支持公共语言运行时的所有编译器都将发出嵌套类的简单名称,反射将在查询时根据以下约定构造一个损坏的名称。
备注
在 .NET Framework 2.0 版中,处理器体系结构将添加到程序集标识,并可以指定为程序集名称字符串的一部分。 例如,"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 Tuple`1
Tuple`2
中返回 ,在 Visual Tuple(Of T)
Tuple(Of T0, T1)
Tuple<T>
Tuple<T0, T1>
C# 中返回 和 。
对于泛型类型,类型参数列表用方括号括起来,类型实参用逗号分隔。 例如,泛型具有 Dictionary<TKey,TValue> 两个类型参数。 具有 Dictionary<TKey,TValue> MyType
类型的键的 String 的 可能表示如下:
System.Collections.Generic.Dictionary`2[System.String,MyType]
若要在类型参数列表中指定程序集限定类型,请用括号将程序集限定的类型括起来。 否则,分隔程序集限定名称各部分的逗号将被解释为分隔其他类型参数。 例如,可能fromMyAssembly.dll类型的键的 的 Dictionary<TKey,TValue> MyType
String :
Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]")
备注
程序集限定类型仅在出现在类型参数列表中时,才能用方括号括起来。 在类型参数列表中搜索限定和非限定类型的程序集的规则与限定和非限定非一般类型的规则相同。
可为空类型是泛型类型的特殊情况。 例如,可为空的 Int32 由字符串"System.Nullable'1[System.Int32]"表示。
备注
在 C#、C++ 和 Visual Basic可以使用类型运算符获取可为空类型。 例如,可为空的类型在 C# 中由 返回,在 C++ 中由 返回,在 Boolean typeof(Nullable<bool>)
Nullable<Boolean>::typeid
C++ GetType(Nullable(Of Boolean))
中由 在 Visual Basic。
下表显示了用于各种类型的 GetType
语法。
获取 | 使用 |
---|---|
可为空 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)
获取具有指定名称的 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
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
GetType
Visual Basic。
GetType
仅适用于从磁盘加载的程序集。 如果调用 GetType
查找使用 服务定义的动态程序集中定义的类型 System.Reflection.Emit ,则可能会获得不一致的行为。 行为取决于动态程序集是持久性的,即使用 枚举的 RunAndSave
或 访问 Save
模式 System.Reflection.Emit.AssemblyBuilderAccess 创建的。 如果动态程序集是持久性的,并且已在调用 之前写入磁盘,则加载程序在磁盘上查找保存的程序集,加载该程序集,然后从该程序集 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。
如果 包含命名空间,但不包括程序集名称,则此方法仅按该顺序搜索调用对象的程序集mscorlib.dlltypeName
/System.Private.CoreLib.dll /System.Private.CoreLib.dll 。 如果使用部分或完整程序集名称完全限定 typeName,则此方法将搜索指定的程序集。 如果程序集具有强名称,则要求使用完整的程序集名称。
属性 AssemblyQualifiedName 返回完全限定的类型名称,包括嵌套类型、程序集名称和泛型参数。 支持公共语言运行时的所有编译器都将发出嵌套类的简单名称,反射将在查询时根据以下约定构造一个损坏的名称。
备注
在 .NET Framework 2.0 版中,处理器体系结构将添加到程序集标识,并可以指定为程序集名称字符串的一部分。 例如,"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`1
以及 Tuple`2
从泛型方法 Tuple(Of T)
和 Tuple(Of T0, T1)
在 Tuple<T>
Visual c # 中的 Visual Basic、和 Tuple<T0, T1>
。
对于泛型类型,类型参数列表括在括号中,类型参数由逗号分隔。 例如,泛型 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 的类型是泛型类型的特例。 例如, 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
用于各种类型的语法。
获取 | 使用 |
---|---|
可以为 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-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)
获取具有指定名称的 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
,且未找到程序集或程序集的某个依赖项。
找到了程序集或其依赖项之一,但无法加载它们。
注解
GetType Type 如果知道程序集限定名称(可从获取),则可以使用方法获取其他程序集中的类型的对象 AssemblyQualifiedName 。 GetType 导致加载中指定的程序集 typeName
。 您还可以使用方法加载程序集 Assembly.Load ,然后使用 Assembly.GetType 或 Assembly.GetTypes 方法来获取 Type 对象。 如果某个类型位于您的程序在编译时已知的程序集中,则在 Visual Basic 中使用 typeof
c # 或运算符更为有效 GetType
。
GetType
仅适用于从磁盘加载的程序集。 如果调用 GetType
查找使用服务定义的动态程序集中定义的类型 System.Reflection.Emit ,可能会出现不一致的行为。 此行为取决于动态程序集是否为持久性的,即使用 RunAndSave
枚举的或 Save
访问模式创建的 System.Reflection.Emit.AssemblyBuilderAccess 。 如果动态程序集是持久性的,并且在调用之前已写入磁盘, GetType
则加载程序将在磁盘上找到保存的程序集,加载该程序集,并从该程序集检索该类型。 如果在调用时未将程序集保存到磁盘 GetType
,则该方法将返回 null
。 GetType
不了解瞬态动态程序集;因此,调用 GetType
以检索暂时性动态程序集中的类型会返回 null
。
若要 GetType
在动态模块上使用,请订阅 AppDomain.AssemblyResolve 事件并在 GetType
保存前调用。 否则,将在内存中获取程序集的两个副本。
throwOnError
参数指定当找不到该类型时所发生的情况,还会取消某些其他异常条件,如 "异常" 一节中所述。 引发一些异常,而不考虑的值 throwOnError
。 例如,如果找到类型但无法加载,则即使为,也 TypeLoadException 会引发 throwOnError
false
。
下表显示了 Get
在类型上反射时方法返回的基类成员。
成员类型 | 静态 | 非静态 |
---|---|---|
构造函数 | 否 | 否 |
字段 | 否 | 可以。 字段始终按名称和签名隐藏。 |
事件 | 不适用 | 通用类型系统规则是指继承与实现属性的方法相同。 反射将属性视为隐藏的名称和签名。 请参阅下面的注释2。 |
方法 | 否 | 可以。 虚拟和非虚拟) (方法可以是按名称隐藏或按名称和签名隐藏。 |
嵌套类型 | 否 | 否 |
properties | 不适用 | 通用类型系统规则是指继承与实现属性的方法相同。 反射将属性视为隐藏的名称和签名。 请参阅下面的注释2。 |
按名称和签名隐藏将考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、个 sentinel 和非托管调用约定。 这是二进制比较。
对于反射,属性和事件是按名称和签名隐藏的。 如果在基类中同时具有 get 访问器和 set 访问器的属性,但派生类只有 get 访问器,则派生类属性将隐藏基类属性,并且你将无法访问基类的资源库。
自定义属性不属于通用类型系统。
不会搜索数组或 COM 类型,除非已将它们加载到可用类的表中。
typeName
可以是其命名空间限定的类型名称,也可以是包含程序集名称规范的程序集限定名称。 请参阅 AssemblyQualifiedName。
如果 typeName
包含命名空间而不包含程序集名称,则此方法将仅搜索调用对象的程序集,并按该顺序 mscorlib.dll/System.Private.CoreLib.dll。 如果 typeName 完全限定了部分或完整的程序集名称,则此方法将在指定的程序集中搜索。 如果程序集具有强名称,则需要完整的程序集名称。
AssemblyQualifiedName属性返回完全限定的类型名称,包括嵌套类型、程序集名称和类型参数。 所有支持公共语言运行时的编译器都将发出嵌套类的简单名称,并且在查询时,反射将按照以下约定构造错位的名称。
备注
在 .NET Framework 版本2.0 中,处理器体系结构添加到程序集标识,并可指定为程序集名称字符串的一部分。 例如,"ProcessorArchitecture = msil"。 不过,由于兼容性原因,它不包含在由属性返回的字符串中 AssemblyQualifiedName 。 还可以通过创建 AssemblyName 对象并将其传递给方法的适当重载来加载类型 Load 。 然后,可以使用 Assembly.GetType 方法从程序集加载类型。 另请参阅 AssemblyName.ProcessorArchitecture。
分隔符 | 含义 |
---|---|
反斜杠 (\) | 转义符。 |
反撇号 (") | 在一个或多个数字之前,表示泛型类型名称末尾的类型参数的数目。 |
方括号 ( [] ) | 为构造的泛型类型包含泛型类型参数列表;在类型参数列表中,将程序集限定的类型括起来。 |
逗号 (,) | 在程序集名称之前。 |
句点 (.) | 表示命名空间标识符。 |
加号 (+) | 在嵌套类之前。 |
例如,类的完全限定名称可能如下所示:
TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly
如果命名空间为 TopNamespace + 命名空间,则字符串必须在加号 (+) 之前加上转义符 (\) ,以防止它被解释为嵌套分隔符。 反射发出此字符串,如下所示:
TopNamespace.Sub\+Namespace.ContainingClass+NestedClass,MyAssembly
"+ +" 变成 " \ + \ +",而 " \ " 变成 "" \ \ 。
此限定名称可以保留,以后用于加载 Type 。 若要搜索并加载 Type ,请将 GetType 与类型名称一起使用,或者使用带有程序集限定类型名称的。 GetType 只有类型名称才会 Type 在调用方的程序集中查找,然后在系统程序集中查找。 GetType 具有程序集限定类型名称的将 Type 在任何程序集中查找。
类型名称可能包含表示类型附加信息的尾随字符,如类型是引用类型、指针类型还是数组类型。 若要检索不包含这些尾随字符的类型名称,请使用 t.GetElementType().ToString()
,其中 t
是类型。
空格在除程序集名称之外的所有类型名称组件中都是相关的。 在程序集名称中,"," 分隔符前面的空格是相关的,但 "," 分隔符后面的空格将被忽略。
泛型类型的名称以反撇号 (结尾, `) 后跟表示泛型类型参数数目的数字。 此名称重整的用途是允许编译器支持具有相同名称但具有不同数量的类型参数的泛型类型,这些类型在同一范围内发生。 例如,反射返回了错位的名称 Tuple`1
以及 Tuple`2
从泛型方法 Tuple(Of T)
和 Tuple(Of T0, T1)
在 Tuple<T>
Visual c # 中的 Visual Basic、和 Tuple<T0, T1>
。
对于泛型类型,类型参数列表括在括号中,类型参数由逗号分隔。 例如,泛型 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 的类型是泛型类型的特例。 例如, 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
用于各种类型的语法。
获取 | 使用 |
---|---|
可以为 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-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>)
获取具有指定名称的类型,(可选)提供自定义方法以解析程序集和该类型。
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
。 它不会引发异常。 若要控制是否引发异常,请调用 GetType 具有参数的方法的重载 throwOnError
。
调用此方法重载与调用 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)
获取具有指定名称的类型,指定在找不到该类型时是否引发异常,(可选)提供自定义方法以解析程序集和该类型。
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
。
适用于
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean)
获取具有指定名称的类型,指定是否执行区分大小写的搜索,在找不到类型时是否引发异常,(可选)提供自定义方法以解析程序集和该类型。
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
,且未找到程序集或程序集的某个依赖项。
注解
使用此方法重载及其关联重载 (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
:
类型名称的内容 | 程序集解析程序方法 | 类型解析程序方法 | 结果 |
---|---|---|---|
类型、程序集 | null | null | 等效于调用 Type.GetType(String, Boolean, Boolean) 方法重载。 |
类型、程序集 | 规定 | null | assemblyResolver 返回程序集, null 如果无法解析程序集,则返回。 如果对程序集进行解析,则 Assembly.GetType(String, Boolean, Boolean) 使用方法重载从程序集加载类型; 否则,将不会尝试解析该类型。 |
类型、程序集 | null | 规定 | 等效于将程序集名称转换为 AssemblyName 对象,并调用 Assembly.Load(AssemblyName) 方法重载以获取程序集。 如果对程序集进行解析,则将其传递到 typeResolver ; 否则,将不会调用,也不 typeResolver 会再尝试解析该类型。 |
类型、程序集 | 规定 | 规定 | assemblyResolver 返回程序集, null 如果无法解析程序集,则返回。 如果对程序集进行解析,则将其传递到 typeResolver ; 否则,将不会调用,也不 typeResolver 会再尝试解析该类型。 |
type | 提供空值 | null | 等效于调用 Type.GetType(String, Boolean, Boolean) 方法重载。 由于未提供程序集名称,因此只会搜索 mscorlib.dll/System.Private.CoreLib.dll 和当前正在执行的程序集。 如果 assemblyResolver 提供了,则将其忽略。 |
type | 提供空值 | 规定 | typeResolver 为 null 程序集调用并传递。 typeResolver 可以提供任何程序集中的类型,包括为此目的而加载的程序集。 如果 assemblyResolver 提供了,则将其忽略。 |
程序集 (assembly) | 提供空值 | 提供空值 | FileLoadException引发,因为程序集名称被分析为程序集限定的类型名称。 这会导致无效的程序集名称。 |