本文提供此 API 參考文件的補充備註。
Type 類別是 System.Reflection 功能的根目錄,也是存取元數據的主要方式。 使用 Type 的成員來取得類型宣告、類型成員的相關信息(例如建構函式、方法、欄位、屬性和類別的事件),以及部署類別的模組和元件。
程序代碼不需要任何許可權,即可使用反映來取得類型及其成員的相關信息,而不論其存取層級為何。 程序代碼不需要任何許可權,即可使用反射來存取公用成員,或存取在一般編譯期間由於存取層級可見的其他成員。 不過,為了讓程式碼使用反射來存取通常無法存取的成員,例如私用或內部方法,或類別未繼承的受保護欄位,您的程式碼必須具有 ReflectionPermission。 請參閱 反射的安全性考慮。
Type 是允許多個實作的抽象基類。 系統一律會提供衍生類別 RuntimeType。 在反思時,所有以 Runtime 一詞開頭的類別在系統中每個物件只會創建一次,並支援比較運算。
備註
在多線程案例中,請勿鎖定 Type 物件,以便同步存取 static 數據。 沒有控制權的其他程式代碼也可能鎖定您的類別類型。 這可能會導致死結。 相反地,藉由鎖定私有 static 物件來同步存取靜態資料。
備註
衍生類別可以存取呼叫程式代碼基類的受保護成員。 此外,允許存取呼叫程式代碼的組件成員。 一般來說,如果您在早期綁定程式碼中可以存取,那麼在晚期綁定程式碼中也可以存取。
備註
擴充其他介面的介面不會繼承擴充介面中定義的方法。
Type 物件代表哪些類型?
此類別是安全線程;多個線程可以同時從此類型的實例讀取。 Type 類別的實體可以代表下列任何類型:
- 班級
- 值類型
- 陣列
- 介面
- 列舉
- 代表們
- 建構的泛型型別和泛型型別定義
- 建構泛型型別、泛型型別定義和泛型方法定義的型別引數和型別參數
擷取 Type 物件
您可以使用下列方式取得與特定類型相關聯的 Type 物件:
實例 Object.GetType 方法會傳回代表實例類型的 Type 物件。 由於所有 Managed 型別都衍生自 Object,因此可以在任何類型的實例上呼叫 GetType 方法。
下列範例會呼叫 Object.GetType 方法來判斷物件陣列中每個物件的運行時間類型。
object[] values = { "word", true, 120, 136.34, 'a' }; foreach (var value in values) Console.WriteLine($"{value} - type {value.GetType().Name}"); // The example displays the following output: // word - type String // True - type Boolean // 120 - type Int32 // 136.34 - type Double // a - type Charlet values: obj[] = [| "word"; true; 120; 136.34; 'a' |] for value in values do printfn $"{value} - type {value.GetType().Name}" // The example displays the following output: // word - type String // True - type Boolean // 120 - type Int32 // 136.34 - type Double // a - type CharModule Example1 Public Sub Main() Dim values() As Object = { "word", True, 120, 136.34, "a"c } For Each value In values Console.WriteLine("{0} - type {1}", value, value.GetType().Name) Next End Sub End Module ' The example displays the following output: ' word - type String ' True - type Boolean ' 120 - type Int32 ' 136.34 - type Double ' a - type Char靜態 Type.GetType 方法會傳回 Type 物件,代表其完整名稱所指定的類型。
Module.GetTypes、Module.GetType和 Module.FindTypes 方法會傳回
Type對象,這些物件代表模組中定義的類型。 第一個方法可用來取得模組中定義之所有公用和私用型別 Type 對象的數位。 (您可以透過Module或 Assembly.GetModule 方法,或透過 Assembly.GetModules 屬性取得 Type.Module 的實例。System.Reflection.Assembly 物件包含一些方法來擷取元件中定義的類別,包括 Assembly.GetType、Assembly.GetTypes和 Assembly.GetExportedTypes。
FindInterfaces 方法會傳回類型所支援的介面類型篩選清單。
GetElementType 方法會傳回代表 專案的
Type物件。GetInterfaces 和 GetInterface 方法會傳回代表型別所支援介面類型的 Type 物件。
GetTypeArray 方法會傳回 Type 對象的陣列,代表任意物件集所指定的型別。 物件會以類型為 Object的陣列來指定。
GetTypeFromProgID 和 GetTypeFromCLSID 方法適用於 COM 互作性。 它們會傳回 Type 物件,代表
ProgID或CLSID所指定的型別。GetTypeFromHandle 方法是為了互作性而提供。 它會傳回代表類別句柄所指定類型的
Type物件。C#
typeof運算子、C++typeid運算子,以及 Visual BasicGetType運算子會取得類型的Type物件。MakeGenericType 方法會傳回 Type 物件,代表建構的泛型型別,如果其 ContainsGenericParameters 屬性傳回
true,則為開放式建構型別,否則為封閉式建構型別。 只有在關閉泛型類型時,才能具現化。MakeArrayType、MakePointerType和 MakeByRefType 方法會分別傳回 Type 對象,這些物件分別代表指定類型的陣列、指定類型的指標,以及參考參數的類型(在 C# 中為
ref,在 Visual Basic 中為 'byref'ByRef)。
比較類型物件是否相等
代表型別的 Type 對像是唯一的;也就是說,如果兩個 Type 對象參考代表相同類型,則只會參考相同的物件。 這允許使用參考相等來比較 Type 物件。 下列範例會比較代表整數值數目的 Type 物件,以判斷它們是否屬於相同類型。
long number1 = 1635429;
int number2 = 16203;
double number3 = 1639.41;
long number4 = 193685412;
// Get the type of number1.
Type t = number1.GetType();
// Compare types of all objects with number1.
Console.WriteLine($"Type of number1 and number2 are equal: {Object.ReferenceEquals(t, number2.GetType())}");
Console.WriteLine($"Type of number1 and number3 are equal: {Object.ReferenceEquals(t, number3.GetType())}");
Console.WriteLine($"Type of number1 and number4 are equal: {Object.ReferenceEquals(t, number4.GetType())}");
// The example displays the following output:
// Type of number1 and number2 are equal: False
// Type of number1 and number3 are equal: False
// Type of number1 and number4 are equal: True
let number1 = 1635429L
let number2 = 16203
let number3 = 1639.41
let number4 = 193685412L
// Get the type of number1.
let t = number1.GetType()
// Compare types of all objects with number1.
printfn $"Type of number1 and number2 are equal: {Object.ReferenceEquals(t, number2.GetType())}"
printfn $"Type of number1 and number3 are equal: {Object.ReferenceEquals(t, number3.GetType())}"
printfn $"Type of number1 and number4 are equal: {Object.ReferenceEquals(t, number4.GetType())}"
// The example displays the following output:
// Type of number1 and number2 are equal: False
// Type of number1 and number3 are equal: False
// Type of number1 and number4 are equal: True
Module Example
Public Sub Main()
Dim number1 As Long = 1635429
Dim number2 As Integer = 16203
Dim number3 As Double = 1639.41
Dim number4 As Long = 193685412
' Get the type of number1.
Dim t As Type = number1.GetType()
' Compare types of all objects with number1.
Console.WriteLine("Type of number1 and number2 are equal: {0}",
Object.ReferenceEquals(t, number2.GetType()))
Console.WriteLine("Type of number1 and number3 are equal: {0}",
Object.ReferenceEquals(t, number3.GetType()))
Console.WriteLine("Type of number1 and number4 are equal: {0}",
Object.ReferenceEquals(t, number4.GetType()))
End Sub
End Module
' The example displays the following output:
' Type of number1 and number2 are equal: False
' Type of number1 and number3 are equal: False
' Type of number1 and number4 are equal: True