添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)

获取具有指定名称的类型,指定在找不到该类型时是否引发异常,(可选)提供自定义方法以解析程序集和该类型。

GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean)

获取具有指定名称的类型,指定是否执行区分大小写的搜索,在找不到类型时是否引发异常,(可选)提供自定义方法以解析程序集和该类型。

public Type GetType ();
override this.GetType : unit -> Type
Public Function GetType () As 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

要获取的类型的程序集限定名称。 请参阅 AssemblyQualifiedName 。 如果该类型位于当前正在执行的程序集中或者 mscorlib.dll/System.Private.CoreLib.dll 中,则提供由命名空间限定的类型名称就足够了。

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() ' 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() ' 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 类的成员。

  • "按名称隐藏"和"签名"考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、sentinels 以及非托管调用约定。 这是二进制比较。

  • 对于反射,属性和事件按名称和签名进行隐藏。 如果属性在基类中同时具有 get 和 set 访问器,但派生类只有 get 访问器,则派生类属性将隐藏基类属性,并且你将无法访问基类上的 setter。

  • 自定义属性不是通用类型系统的一部分。

    除非数组或 COM 类型已加载到可用类的表中,否则不会搜索它们。

    typeName 可以是由命名空间限定的类型名称,或者是包含程序集名称规范的程序集限定名称。 请参阅 AssemblyQualifiedName

    如果 包含 命名空间,但不包括程序集名称,则此方法仅搜索调用对象的程序集,mscorlib.dll typeName /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 语法。

    具有两个程序集限定类型参数的泛型类型 Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]") 具有程序集限定类型参数的程序集限定泛型类型 Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly") 一个泛型类型,其类型参数是具有两个类型参数的泛型类型 Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]")
    public:
     static Type ^ GetType(System::String ^ typeName, 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

    如果为 true,则在找不到该类型时引发异常;如果为 false,则返回 null。 指定 false 还会取消某些其他异常条件,但并不取消所有条件。 请参见“异常”部分。

    下面的示例检索的类型 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() ' 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() ' 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.GetTypeAssembly.GetTypes 方法来获取 Type 对象。 如果类型位于程序在编译时已知的程序集中,在 C# 中或程序集中的 运算符 typeof GetType Visual Basic。

    GetType 仅适用于从磁盘加载的程序集。 如果调用 GetType 查找使用 服务定义的动态程序集中定义的类型 System.Reflection.Emit ,则可能会获得不一致的行为。 行为取决于动态程序集是持久性的,即使用 枚举的 RunAndSave 或 访问 Save 模式 System.Reflection.Emit.AssemblyBuilderAccess 创建的。 如果动态程序集是持久性的,并且已在调用 之前写入磁盘,则加载程序在磁盘上查找保存的程序集,加载该程序集,然后从该程序集 GetType 检索类型。 如果在调用 时程序集尚未保存到磁盘 GetType ,则 方法返回 nullGetType 不了解暂时性动态程序集;因此, GetType 调用 以检索暂时性动态程序集中的类型将返回 null

    若要在 GetType 动态模块上使用 ,请订阅 AppDomain.AssemblyResolve 事件并调用 , GetType 然后再保存。 否则,将在内存中获取程序集的两个副本。

    参数指定找不到类型时发生的情况,并取消某些其他异常条件,如 throwOnError 异常部分中所述。 无论 的值如何,都会引发某些异常 throwOnError 。 例如,如果找到类型但无法加载,则即使 为 , TypeLoadException 也会引发 throwOnError false

    下表显示了在类型上反射时,方法返回的基 Get 类的成员。

  • "按名称隐藏"和"签名"考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、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 用于各种类型的语法。

    具有两个程序集限定类型参数的泛型类型 Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]") 具有程序集限定类型参数的程序集限定的泛型类型 Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly") 一个泛型类型,其类型自变量是具有两个类型参数的泛型类型 Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]")
    public:
     static Type ^ GetType(System::String ^ typeName, 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

    GetType Type 如果知道程序集限定名称(可从获取),则可以使用方法获取其他程序集中的类型的对象 AssemblyQualifiedNameGetType 导致加载中指定的程序集 typeName 。 您还可以使用方法加载程序集 Assembly.Load ,然后使用 Assembly.GetTypeAssembly.GetTypes 方法来获取 Type 对象。 如果某个类型位于您的程序在编译时已知的程序集中,则在 Visual Basic 中使用 typeof c # 或运算符更为有效 GetType

    GetType 仅适用于从磁盘加载的程序集。 如果调用 GetType 查找使用服务定义的动态程序集中定义的类型 System.Reflection.Emit ,可能会出现不一致的行为。 此行为取决于动态程序集是否为持久性的,即使用 RunAndSave 枚举的或 Save 访问模式创建的 System.Reflection.Emit.AssemblyBuilderAccess 。 如果动态程序集是持久性的,并且在调用之前已写入磁盘, GetType 则加载程序将在磁盘上找到保存的程序集,加载该程序集,并从该程序集检索该类型。 如果在调用时未将程序集保存到磁盘 GetType ,则该方法将返回 nullGetType 不了解瞬态动态程序集;因此,调用 GetType 以检索暂时性动态程序集中的类型会返回 null

    若要 GetType 在动态模块上使用,请订阅 AppDomain.AssemblyResolve 事件并在 GetType 保存前调用。 否则,将在内存中获取程序集的两个副本。

    throwOnError参数指定当找不到该类型时所发生的情况,还会取消某些其他异常条件,如 "异常" 一节中所述。 引发一些异常,而不考虑的值 throwOnError 。 例如,如果找到类型但无法加载,则即使为,也 TypeLoadException 会引发 throwOnError false

    下表显示了 Get 在类型上反射时方法返回的基类成员。

  • 按名称和签名隐藏将考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、个 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 用于各种类型的语法。

    具有两个程序集限定类型参数的泛型类型 Type.GetType("MyGenericType`2[[MyType,MyAssembly],[AnotherType,AnotherAssembly]]") 具有程序集限定类型参数的程序集限定的泛型类型 Type.GetType("MyGenericType`1[[MyType,MyAssembly]],MyGenericTypeAssembly") 一个泛型类型,其类型自变量是具有两个类型参数的泛型类型 Type.GetType("MyGenericType`1[AnotherGenericType`2[MyType,AnotherType]]")
    public:
     static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver);
    public static Type? GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver);
    public static Type GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly> assemblyResolver, Func<System.Reflection.Assembly,string,bool,Type> typeResolver);
    static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> -> Type
    Public Shared Function GetType (typeName As String, assemblyResolver As Func(Of AssemblyName, Assembly), typeResolver As Func(Of Assembly, String, Boolean, Type)) As Type

    一个方法,它定位并返回 typeName 中指定的程序集。 以 assemblyResolver 对象形式传递给 AssemblyName 的程序集名称。 如果 typeName 不包含程序集的名称,则不调用 assemblyResolver。 如果未提供 assemblyResolver,则执行标准程序集解析。

    警告 不要通过未知的或不受信任的调用方传递方法。 此操作可能会导致恶意代码特权提升。 仅使用你提供或者熟悉的方法。

    一个方法,它在由 typeName 或标准程序集解析返回的程序集中定位并返回 assemblyResolver 所指定的类型。 如果未提供任何程序集,则 typeResolver 方法可以提供一个程序集。 该方法还采用一个参数以指定是否执行不区分大小写的搜索;false 传递给该参数。

    警告 不要通过未知的或不受信任的调用方传递方法。

    此方法的使用方案以及有关和参数的详细信息 assemblyResolver typeResolver 可在 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) 方法重载中找到。

    如果 typeName 找不到,则对方法的调用将 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) 返回 null 。 它不会引发异常。 若要控制是否引发异常,请调用 GetType 具有参数的方法的重载 throwOnError

    调用此方法重载与调用 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) 方法重载和 falsethrowOnError 和参数指定的方法相同 ignoreCase

    public:
     static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver, bool throwOnError);
    public static Type? GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver, bool throwOnError);
    public static Type GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly> assemblyResolver, Func<System.Reflection.Assembly,string,bool,Type> typeResolver, bool throwOnError);
    static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool -> Type
    Public Shared Function GetType (typeName As String, assemblyResolver As Func(Of AssemblyName, Assembly), typeResolver As Func(Of Assembly, String, Boolean, Type), throwOnError As Boolean) As Type

    一个方法,它定位并返回 typeName 中指定的程序集。 以 assemblyResolver 对象形式传递给 AssemblyName 的程序集名称。 如果 typeName 不包含程序集的名称,则不调用 assemblyResolver。 如果未提供 assemblyResolver,则执行标准程序集解析。

    警告 不要通过未知的或不受信任的调用方传递方法。 此操作可能会导致恶意代码特权提升。 仅使用你提供或者熟悉的方法。

    一个方法,它在由 typeName 或标准程序集解析返回的程序集中定位并返回 assemblyResolver 所指定的类型。 如果未提供任何程序集,则该方法可以提供一个程序集。 该方法还采用一个参数以指定是否执行不区分大小写的搜索;false 传递给该参数。

    警告 不要通过未知的或不受信任的调用方传递方法。

    如果为 true,则在找不到该类型时引发异常;如果为 false,则返回 null。 指定 false 还会取消某些其他异常条件,但并不取消所有条件。 请参见“异常”部分。

    此方法的使用方案以及有关和参数的详细信息 assemblyResolver typeResolver 可在 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) 方法重载中找到。

    调用此方法重载与调用 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) 方法重载和为参数指定的方法相同 false ignoreCase

    public:
     static Type ^ GetType(System::String ^ typeName, Func<System::Reflection::AssemblyName ^, System::Reflection::Assembly ^> ^ assemblyResolver, Func<System::Reflection::Assembly ^, System::String ^, bool, Type ^> ^ typeResolver, bool throwOnError, bool ignoreCase);
    public static Type? GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly?>? assemblyResolver, Func<System.Reflection.Assembly?,string,bool,Type?>? typeResolver, bool throwOnError, bool ignoreCase);
    public static Type GetType (string typeName, Func<System.Reflection.AssemblyName,System.Reflection.Assembly> assemblyResolver, Func<System.Reflection.Assembly,string,bool,Type> typeResolver, bool throwOnError, bool ignoreCase);
    static member GetType : string * Func<System.Reflection.AssemblyName, System.Reflection.Assembly> * Func<System.Reflection.Assembly, string, bool, Type> * bool * bool -> Type
    Public Shared Function GetType (typeName As String, assemblyResolver As Func(Of AssemblyName, Assembly), typeResolver As Func(Of Assembly, String, Boolean, Type), throwOnError As Boolean, ignoreCase As Boolean) As Type

    一个方法,它定位并返回 typeName 中指定的程序集。 以 assemblyResolver 对象形式传递给 AssemblyName 的程序集名称。 如果 typeName 不包含程序集的名称,则不调用 assemblyResolver。 如果未提供 assemblyResolver,则执行标准程序集解析。

    警告 不要通过未知的或不受信任的调用方传递方法。 此操作可能会导致恶意代码特权提升。 仅使用你提供或者熟悉的方法。

    一个方法,它在由 typeName 或标准程序集解析返回的程序集中定位并返回 assemblyResolver 所指定的类型。 如果未提供任何程序集,则该方法可以提供一个程序集。 该方法还采用一个参数以指定是否执行不区分大小写的搜索;ignoreCase 的值传递给该参数。

    警告 不要通过未知的或不受信任的调用方传递方法。

    使用此方法重载及其关联重载 (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>)GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)) ,将方法的默认实现替换为 GetType 更灵活的实现。 通过提供自己的方法来解析类型名称以及包含它们的程序集的名称,您可以执行以下操作:

  • 控制从其加载类型的程序集的版本。

  • 提供另一个查找不包括程序集名称的类型名称的位置。

  • 使用部分程序集名称加载程序集。

  • 返回 System.Type 不是由公共语言运行时 (CLR) 创建的子类。

    例如,在版本容错序列化中,此方法使你能够使用部分名称搜索 "最适合" 程序集。 此方法的其他重载 GetType 需要程序集限定的类型名称,包括版本号。

    类型系统的其他实现可能需要返回 System.Type 不是由 CLR 创建的的子类; 该方法的其他重载返回的所有类型 GetType 都是运行时类型。

    此方法重载及其关联重载分析 typeName 为类型名称和程序集名称,然后解析名称。 程序集名称的解析出现在类型名称解析之前,因为类型名称必须在程序集的上下文中解析。

    如果不熟悉程序集限定类型名称的概念,请参见 AssemblyQualifiedName 属性。

    如果不 typeName 是程序集限定名称,则跳过程序集解析。 可在 mscorlib.dll/System.Private.CoreLib.dll 或当前正在执行的程序集的上下文中解析不合格的类型名称,也可以选择在参数中提供程序集 typeResolver 。 包括或省略不同类型名称解析的程序集名称的效果在 混合名称解析 部分中显示为一个表。

    一般使用说明:

  • 如果方法来自 assemblyResolver typeResolver 未知或不受信任的调用方,请不要将方法传递给或。 仅使用你提供或者熟悉的方法。

    使用来自未知或不受信任调用方的方法可能会导致恶意代码特权提升。

  • 如果省略了 assemblyResolver 和/或 typeResolver 参数,则参数的值 throwOnError 将传递给执行默认解析的方法。

  • 如果 throwOnErrortrue ,则此方法 TypeLoadException 在返回时引发 typeResolver null ,而 FileNotFoundExceptionassemblyResolver 返回时引发 null

  • 此方法不会捕获和引发的 assemblyResolver 异常 typeResolver 。 你负责解析程序方法引发的任何异常。

    解析程序集

    assemblyResolver方法接收一个 AssemblyName 对象,该对象是通过分析中包含的字符串程序集名称生成的 typeName 。 如果不 typeName 包含程序集名称, assemblyResolver 则不会调用并 null 将传递给 typeResolver

    如果 assemblyResolver 未提供,则使用标准程序集探测来定位程序集。 如果 assemblyResolver 提供了,则 GetType 方法不执行标准探测; 在这种情况下,您必须确保您 assemblyResolver 可以处理您传递给它的所有程序集。

    assemblyResolver null 如果无法解析程序集,则该方法应返回。 如果 assemblyResolver 返回 nulltypeResolver 则不会调用,也不会进行进一步的处理; 此外,如果 throwOnErrortrueFileNotFoundException 则引发。

    如果 AssemblyName 传递到的 assemblyResolver 是部分名称,则其一个或多个部分为 null 。 例如,如果它没有版本,则 Version 属性为 null 。 如果 Version 属性、 CultureInfo 属性和 GetPublicKeyToken 方法全部返回 null ,则仅提供程序集的简单名称。 assemblyResolver方法可以使用或忽略程序集名称的所有部分。

    对于简单的和程序集限定的类型名称,不同的程序集解析选项的作用在 混合名称解析 部分中显示为一个表。

    如果 typeName 未指定程序集名称, typeResolver 则始终调用。 如果 typeName 指定程序集名称, typeResolver 则只有在成功解析程序集名称时才会调用。 如果 assemblyResolver 或标准程序集探测返回 nulltypeResolver 则不会调用。

    typeResolver方法收到三个参数:

  • 要搜索的程序集, null 如果不 typeName 包含程序集名称,则为。

  • 类型的简单名称。 对于嵌套类型,这是最外层的包含类型。 对于泛型类型,这是泛型类型的简单名称。

  • 一个布尔值, true 如果要忽略类型名称的大小写,则为。

    实现确定使用这些参数的方式。 typeResolver如果方法无法解析类型,则应返回 null 。 如果 typeResolver 返回 nullthrowOnErrortrue ,则的此重载将 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 ,则必须删除转义符。

    返回到 使用说明

    混合名称解析

    下表总结了 assemblyResolvertypeResolver 和默认名称解析之间的交互,适用于中的类型名称和程序集名称的所有组合 typeName

    类型名称的内容 程序集解析程序方法 类型解析程序方法 assemblyResolver 返回程序集, null 如果无法解析程序集,则返回。 如果对程序集进行解析,则 Assembly.GetType(String, Boolean, Boolean) 使用方法重载从程序集加载类型; 否则,将不会尝试解析该类型。 类型、程序集 等效于将程序集名称转换为 AssemblyName 对象,并调用 Assembly.Load(AssemblyName) 方法重载以获取程序集。 如果对程序集进行解析,则将其传递到 typeResolver ; 否则,将不会调用,也不 typeResolver 会再尝试解析该类型。 类型、程序集 assemblyResolver 返回程序集, null 如果无法解析程序集,则返回。 如果对程序集进行解析,则将其传递到 typeResolver ; 否则,将不会调用,也不 typeResolver 会再尝试解析该类型。 等效于调用 Type.GetType(String, Boolean, Boolean) 方法重载。 由于未提供程序集名称,因此只会搜索 mscorlib.dll/System.Private.CoreLib.dll 和当前正在执行的程序集。 如果 assemblyResolver 提供了,则将其忽略。 typeResolvernull 程序集调用并传递。 typeResolver 可以提供任何程序集中的类型,包括为此目的而加载的程序集。 如果 assemblyResolver 提供了,则将其忽略。 程序集 (assembly) FileLoadException引发,因为程序集名称被分析为程序集限定的类型名称。 这会导致无效的程序集名称。

    返回到: 使用说明解析程序集解析类型

  •