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 的陣列。
找到組件或其相依性的其中一個,但無法載入。
注意:在 適用于 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
備註
如果您知道其元件限定名稱,則可以使用 GetType 方法來取得 Type 另一個元件中類型的 物件,這可從 取得 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
傳回的基類成員。
成員類型 | Static | 非靜態 |
---|---|---|
建構函式 | 否 | 否 |
欄位 | 否 | 可以。 欄位一律會依名稱與簽章隱藏。 |
事件 | 不適用 | 常見的型別系統規則是繼承與實作 屬性的方法相同。 反映會將屬性視為 hide-by-name-and-signature。 請參閱下面的附注 2。 |
方法 | 否 | 可以。 (虛擬和非虛擬) 的方法可以是依名稱隱藏或依名稱隱藏和簽章。 |
巢狀類型 | 否 | 否 |
屬性 | 不適用 | 常見的型別系統規則是繼承與實作 屬性的方法相同。 反映會將屬性視為 hide-by-name-and-signature。 請參閱下面的附注 2。 |
依名稱與簽章隱藏會考慮簽章的所有部分,包括自訂修飾詞、傳回類型、參數類型、sentinels 和 Unmanaged 呼叫慣例。 這是二進位比較。
針對反映,屬性和事件會依名稱與簽章隱藏。 如果您的屬性同時具有基類中的 get 和 set 存取子,但衍生類別只有 get 存取子,衍生類別屬性會隱藏基類屬性,而且您將無法在基類上存取 setter。
自訂屬性不是一般型別系統的一部分。
除非陣列或 COM 類型已經載入到可用類別的資料表中,否則不會搜尋這些陣列或 COM 類型。
typeName
可以是依其命名空間限定的類型名稱,或是包含元件名稱規格的元件限定名稱。 請參閱 AssemblyQualifiedName。
如果 typeName
包含命名空間,但不包含元件名稱,這個方法只會依該順序搜尋呼叫物件的元件,並mscorlib.dll/System.Private.CoreLib.dll。 如果 typeName 具有部分或完整元件名稱的完整名稱,這個方法會在指定的元件中搜尋。 如果元件具有強式名稱,則需要完整的元件名稱。
屬性 AssemblyQualifiedName 會傳回完整的型別名稱,包括巢狀類型、元件名稱和泛型型別引數。 所有支援 Common Language Runtime 的編譯器都會發出巢狀類別的簡單名稱,而反映會根據下列慣例,在查詢時建構管理的名稱。
注意
在 .NET Framework 2.0 版中,處理器架構會新增至元件識別,而且可以指定為元件名稱字串的一部分。 例如,「ProcessorArchitecture=msil」。 不過,基於相容性考慮,它不會包含在 屬性所傳回的 AssemblyQualifiedName 字串中。 您也可以藉由建立 AssemblyName 物件,並將它傳遞至方法的適當多載 Load ,以載入類型。 然後 Assembly.GetType ,您可以使用 方法來從元件載入類型。 另請參閱 AssemblyName.ProcessorArchitecture。
分隔符號 | 意義 |
---|---|
反斜線 (\) | 逸出字元。 |
倒引號 (') | 在代表類型參數數目的一或多個數位之前,位於泛型型別名稱的結尾。 |
括弧 ([]) | 針對建構的泛型型別,封入泛型型別引數清單;在類型引數清單中,括住元件限定型別。 |
逗號 (,) | 在元件名稱前面。 |
Period (.) | 表示命名空間識別碼。 |
加號 (+) | 在巢狀類別之前。 |
例如,類別的完整名稱可能如下所示:
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 T)
Tuple(Of T0, T1)
Visual Basic 或 Tuple<T>
Visual C# 中傳 Tuple`2
回受管理的名稱 Tuple`1
和 Tuple<T0, T1>
。
針對泛型型別,類型引數清單會以括弧括住,而類型引數會以逗號分隔。 例如,泛型 Dictionary<TKey,TValue> 有兩個類型參數。 Dictionary<TKey,TValue>MyType
具有 型 String 別索引鍵的 ,可能如下所示:
System.Collections.Generic.Dictionary`2[System.String,MyType]
若要在類型引數清單中指定元件限定類型,請將元件限定型別括在括弧內。 否則,分隔元件限定名稱部分的逗號會解譯為分隔其他類型引數。 例如, Dictionary<TKey,TValue> fromMyAssembly.dll 的 MyType
,其類型 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 的類型。 例如,在 C# 中、 Nullable<Boolean>::typeid
在 C++ 中,以及 GetType(Nullable(Of Boolean))
Visual Basic 中傳回 typeof(Nullable<bool>)
可為 Boolean Null 的類型。
下表顯示您用於 GetType
各種類型的語法。
若要取得 | 使用 |
---|---|
可為 Null Int32 | Type.GetType("System.Nullable`1[System.Int32]") |
的 Unmanaged 指標 MyType |
Type.GetType("MyType*") |
指標的 Unmanaged 指標 MyType |
Type.GetType("MyType**") |
的 Managed 指標或參考 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
open System
try
// Get the type of a specified class.
let myType1 = Type.GetType "System.Int32"
printfn $"The full name is {myType1.FullName}.\n"
with :? TypeLoadException as e ->
printfn $"{e.GetType().Name}: Unable to load type System.Int32"
try
// Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
let myType2 = Type.GetType("NoneSuch", true)
printfn $"The full name is {myType2.FullName}."
with :? TypeLoadException as e ->
printfn $"{e.GetType().Name}: Unable to load type NoneSuch"
// The example displays the following output:
// The full name is System.Int32.
//
// TypeLoadException: Unable to load type NoneSuch
Class Example
Public Shared Sub Main()
Try
' Get the type of the specified class.
Dim myType1 As Type = Type.GetType("System.Int32")
Console.WriteLine("The full name is {0}.", myType1.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type System.Int32",
e.GetType().Name)
End Try
Console.WriteLine()
Try
' Since NoneSuch does not exist in this assembly, GetType throws a TypeLoadException.
Dim myType2 As Type = Type.GetType("NoneSuch", True)
Console.WriteLine("The full name is {0}.", myType2.FullName)
Catch e As TypeLoadException
Console.WriteLine("{0}: Unable to load type NoneSuch", e.GetType().Name)
End Try
End Sub
End Class
' The example displays the following output:
' The full name is System.Int32.
'
' TypeLoadException: Unable to load type NoneSuch
備註
如果您知道其元件限定名稱,則可以使用 GetType 方法來取得 Type 另一個元件中類型的 物件,這可從 取得 AssemblyQualifiedName 。 GetType 會導致載入 中指定的 typeName
元件。 您也可以使用 Assembly.Load 方法來載入元件,然後使用 Assembly.GetType 或 Assembly.GetTypes 方法來取得 Type 物件。 如果類型在編譯時期為程式已知的元件,在 C# 中使用 或 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
為何,都會擲回某些例外狀況。 例如,如果找到型別但無法載入,即使 為 false
, TypeLoadException 也會 throwOnError
擲回 。
下表顯示當反映類型時,方法會 Get
傳回的基類成員。
成員類型 | Static | 非靜態 |
---|---|---|
建構函式 | 否 | 否 |
欄位 | 否 | 可以。 欄位一律會依名稱與簽章隱藏。 |
事件 | 不適用 | 常見的型別系統規則是繼承與實作 屬性的方法相同。 反映會將屬性視為 hide-by-name-and-signature。 請參閱下面的附注 2。 |
方法 | 否 | 可以。 (虛擬和非虛擬) 的方法可以是依名稱隱藏或依名稱隱藏和簽章。 |
巢狀類型 | 否 | 否 |
屬性 | 不適用 | 常見的型別系統規則是繼承與實作 屬性的方法相同。 反映會將屬性視為 hide-by-name-and-signature。 請參閱下面的附注 2。 |
依名稱與簽章隱藏會考慮簽章的所有部分,包括自訂修飾詞、傳回類型、參數類型、sentinels 和 Unmanaged 呼叫慣例。 這是二進位比較。
針對反映,屬性和事件會依名稱與簽章隱藏。 如果您的屬性同時具有基類中的 get 和 set 存取子,但衍生類別只有 get 存取子,衍生類別屬性會隱藏基類屬性,而且您將無法在基類上存取 setter。
自訂屬性不是一般型別系統的一部分。
除非陣列或 COM 類型已經載入到可用類別的資料表中,否則不會搜尋這些陣列或 COM 類型。
typeName
可以是依其命名空間限定的類型名稱,或是包含元件名稱規格的元件限定名稱。 請參閱 AssemblyQualifiedName。
如果 typeName
包含命名空間,但不包含元件名稱,這個方法只會依該順序搜尋呼叫物件的元件,並mscorlib.dll/System.Private.CoreLib.dll。 如果 typeName 具有部分或完整元件名稱的完整名稱,這個方法會在指定的元件中搜尋。 如果元件具有強式名稱,則需要完整的元件名稱。
屬性 AssemblyQualifiedName 會傳回完整的型別名稱,包括巢狀類型、元件名稱和泛型引數。 所有支援 Common Language Runtime 的編譯器都會發出巢狀類別的簡單名稱,而反映會根據下列慣例,在查詢時建構管理的名稱。
注意
在 .NET Framework 2.0 版中,處理器架構會新增至元件識別,而且可以指定為元件名稱字串的一部分。 例如,「ProcessorArchitecture=msil」。 不過,基於相容性考慮,它不會包含在 屬性所傳回的 AssemblyQualifiedName 字串中。 您也可以藉由建立 AssemblyName 物件,並將它傳遞至方法的適當多載 Load ,以載入類型。 然後 Assembly.GetType ,您可以使用 方法從元件載入類型。 另請參閱 AssemblyName.ProcessorArchitecture。
分隔符號 | 意義 |
---|---|
反斜線 (\) | 逸出字元。 |
倒引號 (') | 在代表類型參數數目的一或多個數位之前,位於泛型型別名稱的結尾。 |
方括弧 ([]) | 針對建構的泛型型別,括住泛型型別引數清單;在類型引數清單中,括住元件限定型別。 |
逗號 (,) | 在元件名稱前面。 |
Period (.) | 表示命名空間識別碼。 |
加號 (+) | 在巢狀類別之前。 |
例如,類別的完整名稱可能如下所示:
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 T)
Visual Basic 或 Tuple<T>
Visual C# 中傳回受管理的名稱 Tuple`2
Tuple`1
和 Tuple<T0, T1>
。 Tuple(Of 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 的類型是泛型型別的特殊案例。 例如,可為 Null 的 Int32 表示方式是字串 「System.Nullable'1[System.Int32]」。
注意
在 C#、C++和 Visual Basic 中,您也可以使用類型運算子取得可為 Null 的類型。 例如,在 C# 中、 Nullable<Boolean>::typeid
在 C++ 中,以及 GetType(Nullable(Of Boolean))
Visual Basic 中傳回 typeof(Nullable<bool>)
可為 Boolean Null 的類型。
下表顯示您用於 GetType
各種類型的語法。
若要取得 | 使用 |
---|---|
可為 Null Int32 | Type.GetType("System.Nullable`1[System.Int32]") |
的 Unmanaged 指標 MyType |
Type.GetType("MyType*") |
指標的 Unmanaged 指標 MyType |
Type.GetType("MyType**") |
的 Managed 指標或參考 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)
取得具有指定名稱的 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
為 typeName
執行不區分大小寫的搜尋,則為 true
;為 typeName
執行區分大小寫的搜尋,則為 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
,且找不到此組件或它的一個相依項目。
找到組件或其相依性的其中一個,但無法載入。
備註
如果您知道其元件限定名稱,則可以使用 GetType 方法來取得另一個 Type 元件中類型的 物件,這可從 取得 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
為何,都會擲回某些例外狀況。 例如,如果找到類型但無法載入,即使 throwOnError
是 false
, TypeLoadException 也會擲回 。
下表顯示反映類型時,方法會傳 Get
回基類的成員。
成員類型 | Static | 非靜態 |
---|---|---|
建構函式 | 否 | 否 |
欄位 | 否 | 可以。 欄位一律會依名稱與簽章隱藏。 |
事件 | 不適用 | 常見的類型系統規則是繼承與實作 屬性的方法相同。 反映會將屬性視為依名稱與簽章隱藏。 請參閱下面的附注 2。 |
方法 | 否 | 可以。 (虛擬和非虛擬) 的方法可以是依名稱隱藏或依名稱隱藏和簽章。 |
巢狀類型 | 否 | 否 |
屬性 | 不適用 | 常見的型別系統規則是繼承與實作 屬性的方法相同。 反映會將屬性視為 hide-by-name-and-signature。 請參閱下面的附注 2。 |
依名稱與簽章隱藏會考慮簽章的所有部分,包括自訂修飾詞、傳回類型、參數類型、sentinels 和 Unmanaged 呼叫慣例。 這是二進位比較。
針對反映,屬性和事件會依名稱與簽章隱藏。 如果您的屬性同時具有基類中的 get 和 set 存取子,但衍生類別只有 get 存取子,衍生類別屬性會隱藏基類屬性,而且您將無法在基類上存取 setter。
自訂屬性不是一般型別系統的一部分。
除非陣列或 COM 類型已經載入到可用類別的資料表中,否則不會搜尋這些陣列或 COM 類型。
typeName
可以是依其命名空間限定的類型名稱,或是包含元件名稱規格的元件限定名稱。 請參閱 AssemblyQualifiedName。
如果 typeName
包含命名空間,但不包含元件名稱,這個方法只會依該順序搜尋呼叫物件的元件,並mscorlib.dll/System.Private.CoreLib.dll。 如果 typeName 具有部分或完整元件名稱的完整名稱,這個方法會在指定的元件中搜尋。 如果元件具有強式名稱,則需要完整的元件名稱。
屬性 AssemblyQualifiedName 會傳回完整的類型名稱,包括巢狀類型、元件名稱和類型引數。 所有支援 Common Language Runtime 的編譯器都會發出巢狀類別的簡單名稱,而反映會根據下列慣例,在查詢時建構管理的名稱。
注意
在 .NET Framework 2.0 版中,處理器架構會新增至元件識別,而且可以指定為元件名稱字串的一部分。 例如,「ProcessorArchitecture=msil」。 不過,基於相容性考慮,它不會包含在 屬性所傳回的 AssemblyQualifiedName 字串中。 您也可以藉由建立 AssemblyName 物件,並將它傳遞至方法的適當多載 Load ,以載入類型。 然後 Assembly.GetType ,您可以使用 方法從元件載入類型。 另請參閱 AssemblyName.ProcessorArchitecture。
分隔符號 | 意義 |
---|---|
反斜線 (\) | 逸出字元。 |
倒引號 (') | 在代表類型參數數目的一或多個數位之前,位於泛型型別名稱的結尾。 |
方括弧 ([]) | 針對建構的泛型型別,括住泛型型別引數清單;在類型引數清單中,括住元件限定型別。 |
逗號 (,) | 在元件名稱前面。 |
Period (.) | 表示命名空間識別碼。 |
加號 (+) | 在巢狀類別之前。 |
例如,類別的完整名稱可能如下所示:
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 T)
Visual Basic 或 Tuple<T>
Visual C# 中傳回受管理的名稱 Tuple`2
Tuple`1
和 Tuple<T0, T1>
。 Tuple(Of 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 的型別是泛型型別的特殊案例。 例如,可為 Null 的 Int32 字串為 「System.Nullable'1[System.Int32]」。
注意
在 C#、C++ 和 Visual Basic 中,您也可以使用類型運算子來取得可為 Null 的類型。 例如,可為 Boolean Null 的類型在 C# 中傳回, Nullable<Boolean>::typeid
在 C++ 中為 ,在 Visual Basic 中則傳回 typeof(Nullable<bool>)
。 GetType(Nullable(Of Boolean))
下表顯示您用於 GetType
各種類型的語法。
取得 | 使用 |
---|---|
可為 Null 的 Int32 | Type.GetType("System.Nullable`1[System.Int32]") |
Unmanaged 指標 MyType |
Type.GetType("MyType*") |
指向指標的 Unmanaged 指標 MyType |
Type.GetType("MyType**") |
的 Managed 指標或參考 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>)
取得具有指定名稱的類型,並選擇性提供自訂方法來解析組件和類型。
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 的陣列。
備註
您可以在 方法多載中找到 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) 此方法的使用案例,以及 和 typeResolver
參數的詳細 assemblyResolver
資料。
注意
如果 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) 方法多載和為 throwOnError
和 ignoreCase
參數指定 false
相同。
適用於
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
是有效的組件名稱,沒有型別名稱。
找到組件或其相依性的其中一個,但無法載入。
備註
您可以在 方法多載中找到 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) 此方法的使用案例,以及 和 typeResolver
參數的詳細 assemblyResolver
資料。
呼叫這個方法多載與呼叫 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean, Boolean) 方法多載和為 ignoreCase
參數指定 false
相同。
適用於
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
為 typeName
執行不區分大小寫的搜尋,則為 true
;為 typeName
執行區分大小寫的搜尋,則為 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
,且找不到此組件或它的一個相依項目。
備註
使用這個方法多載及其相關聯的多載 (GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>) 和 GetType(String, Func<AssemblyName,Assembly>, Func<Assembly,String,Boolean,Type>, Boolean)) ,以更有彈性的實作取代方法的預設實 GetType 作。 藉由提供您自己的方法來解析型別名稱和包含這些名稱的元件名稱,您可以執行下列動作:
控制載入類型的來源元件版本。
提供另一個位置來尋找不包含元件名稱的類型名稱。
使用部分元件名稱載入元件。
傳回 Common Language Runtime (CLR) 所建立的子類別 System.Type 。
例如,在版本容錯序列化中,此方法可讓您使用部分名稱來搜尋「最適合」元件。 方法的其他多載 GetType 需要元件限定類型名稱,其中包含版本號碼。
型別系統的替代實作可能需要傳回不是 CLR 所建立的 GetType 子類別 System.Type ;方法其他多載所傳回的所有類型都是執行時間類型。
使用量注意事項
這個方法多載及其相關聯的多載會剖析 typeName
成型別的名稱和元件的名稱,然後解析名稱。 元件名稱的解析會在類型名稱的解析之前發生,因為必須在元件的內容中解析類型名稱。
注意
如果您不熟悉元件限定類型名稱的概念,請參閱 AssemblyQualifiedName 屬性。
如果 typeName
不是元件限定名稱,則會略過元件解析。 在mscorlib.dll/System.Private.CoreLib.dll 或目前執行的元件的內容中,也可以選擇性地在 參數中 typeResolver
提供元件,以解析不合格的類型名稱。 包含或省略不同名稱解析之元件名稱的效果會顯示為 混合名稱解析 區段中的資料表。
一般使用注意事項:
請勿將方法傳遞至
assemblyResolver
或typeResolver
,如果方法來自未知或未受信任的呼叫端,則為 。 只使用您所提供或熟悉的方法。警告
使用未知或未受信任呼叫端的方法可能會導致惡意程式碼的許可權提高。
如果您省略
assemblyResolver
和/或typeResolver
參數,參數的值throwOnError
會傳遞至執行預設解析的方法。如果 為
true
throwOnError
,則這個方法會在 TypeLoadException 傳回null
時typeResolver
擲回 ,而 傳 FileNotFoundException 回 時assemblyResolver
會擲null
回 。這個方法不會攔截 和
typeResolver
擲assemblyResolver
回的例外狀況。 您負責解析程式方法擲回的任何例外狀況。
解析元件
方法 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 則會以遞迴方式呼叫 ,以解析其類型引數等等。
您提供的 和 typeResolver
組合 assemblyResolver
必須能夠解析此遞迴的所有層級。 例如,假設您提供 assemblyResolver
可控制 載入的 MyAssembly
。 假設您想要在 Visual Basic) Dictionary(Of String, MyType)
中解析泛型型別 Dictionary<string, MyType>
(。 您可以傳遞下列泛型型別名稱:
"System.Collections.Generic.Dictionary`2[System.String,[MyNamespace.MyType, MyAssembly]]"
請注意, MyType
這是唯一的元件限定型別引數。 和 String 類別的名稱 Dictionary<TKey,TValue> 不是元件限定。 您必須 typeResolver
能夠處理元件或 null
,因為它會針對 Dictionary<TKey,TValue> 和 String 接收 null
。 它可以藉由呼叫接受字串之 方法的多 GetType 載來處理這種情況,因為兩個不合格的類型名稱都位於 /System.Private.CoreLib.dllmscorlib.dll:
Type t = Type.GetType(test,
(aName) => aName.Name == "MyAssembly" ?
Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") : null,
(assem, name, ignore) => assem == null ?
Type.GetType(name, false, ignore) :
assem.GetType(name, false, ignore)
);
let t =
Type.GetType(test,
(fun aName ->
if aName.Name = "MyAssembly" then
Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
else null),
fun assem name ignr ->
if assem = null then
Type.GetType(name, false, ignr)
else
assem.GetType(name, false, ignr))
assemblyResolver
不會針對字典類型和字串類型呼叫 方法,因為這些類型名稱不是元件限定。
現在假設不是 System.String
,第一個泛型引數類型是從 YourType
YourAssembly
:
"System.Collections.Generic.Dictionary`2[[YourNamespace.YourType, YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], [MyNamespace.MyType, MyAssembly]]"
因為此元件不是mscorlib.dll/System.Private.CoreLib.dll或目前執行中的元件,所以您無法在沒有元件限定名稱的情況下解析 YourType
。 assemblyResolve
因為您的 會以遞迴方式呼叫,所以必須能夠處理這種情況。 它現在會使用提供 AssemblyName 的物件來執行元件載入,而不是針對 以外的 MyAssembly
元件傳回 null
。
Type t2 = Type.GetType(test,
(aName) => aName.Name == "MyAssembly" ?
Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") :
Assembly.Load(aName),
(assem, name, ignore) => assem == null ?
Type.GetType(name, false, ignore) :
assem.GetType(name, false, ignore), true
);
let t2 =
Type.GetType(test,
(fun aName ->
if aName.Name = "MyAssembly" then
Assembly.LoadFrom @".\MyPath\v5.0\MyAssembly.dll"
else Assembly.Load aName),
(fun assem name ignr ->
if assem = null then
Type.GetType(name, false, ignr)
else
assem.GetType(name, false, ignr)), true)
返回 使用注意事項。
解析具有特殊字元的類型名稱
某些字元在元件限定名稱中具有特殊意義。 如果簡單類型名稱包含這些字元,則當簡單名稱是元件限定名稱的一部分時,字元會造成剖析錯誤。 若要避免剖析錯誤,您必須先使用反斜線逸出特殊字元,才能將元件限定名稱傳遞至 GetType 方法。 例如,如果類型名為 Strange]Type
,則必須在方括弧前面新增逸出字元,如下所示: Strange\]Type
。
注意
具有這類特殊字元的名稱無法在 Visual Basic 或 C# 中建立,但可以使用Microsoft中繼語言 (MSIL) 或發出動態元件來建立。
下表顯示類型名稱的特殊字元。
字元 | 意義 |
---|---|
, (逗號) |
元件限定名稱的分隔符號。 |
[] (方括弧) |
做為後置片語,表示陣列類型;以分隔符號組的形式括住泛型引數清單和元件限定名稱。 |
& (& 符號) |
做為尾碼,表示類型為參考型別。 |
* (星號) |
做為尾碼,表示類型是指標類型。 |
+ (加) |
巢狀類型的分隔符號。 |
\ (反斜線) |
逸出字元。 |
屬性,例如 AssemblyQualifiedName 傳回正確的逸出字串。 您必須將正確的逸出字串傳遞至 GetType 方法。 接著,方法會將 GetType 正確逸出的名稱傳遞給 typeResolver
預設類型解析方法。 如果您需要在 中 typeResolver
比較名稱與未逸出的名稱,則必須移除逸出字元。
返回 使用注意事項。
混合名稱解析
下表摘要說明 中所有類型名稱和元件名稱 typeName
組合的 、 typeResolver
和 預設名稱解析之間的 assemblyResolver
互動:
類型名稱的內容 | 元件解析程式方法 | 類型解析程式方法 | 結果 |
---|---|---|---|
類型、元件 | null | null | 相當於呼叫 Type.GetType(String, Boolean, Boolean) 方法多載。 |
類型、元件 | 提供 | null | assemblyResolver 會傳回元件,如果無法解析元件,則傳回 null 。 如果已解析元件, Assembly.GetType(String, Boolean, Boolean) 則會使用 方法多載從元件載入類型,否則不會嘗試解析類型。 |
類型、元件 | null | 提供 | 相當於將元件名稱 AssemblyName 轉換成 物件,並呼叫 Assembly.Load(AssemblyName) 方法多載以取得元件。 如果元件已解析,則會傳遞至 typeResolver ,否則不會呼叫 , typeResolver 而且不會再嘗試解析類型。 |
類型、元件 | 提供 | 提供 | assemblyResolver 會傳回元件,如果無法解析元件,則傳回 null 。 如果元件已解析,則會傳遞至 typeResolver ,否則不會呼叫 , typeResolver 而且不會再嘗試解析類型。 |
類型 | null,提供 | null | 相當於呼叫 Type.GetType(String, Boolean, Boolean) 方法多載。 由於未提供元件名稱,因此只會搜尋mscorlib.dll/System.Private.CoreLib.dll 和目前正在執行的元件。 如果 assemblyResolver 提供 ,則會忽略它。 |
類型 | null,提供 | 提供 | typeResolver 會呼叫 ,並 null 傳遞給元件。 typeResolver 可以從任何元件提供類型,包括它為了目的而載入的元件。 如果 assemblyResolver 提供 ,則會忽略它。 |
組件 | null,提供 | null,提供 | FileLoadException會擲回 ,因為元件名稱會剖析為元件限定型別名稱。 這會導致不正確元件名稱。 |