System.Type 類別

本文提供此 API 參考文件的補充備註。

類別 Type 是功能的根目錄, System.Reflection 也是存取元數據的主要方式。 使用的成員 Type 來取得類型宣告、類型成員的相關信息(例如建構函式、方法、欄位、屬性和類別的事件),以及部署類別的模組和元件。

程序代碼不需要任何許可權,即可使用反映來取得類型及其成員的相關信息,而不論其存取層級為何。 程序代碼不需要任何許可權,才能使用反映來存取公用成員,或存取層級會在一般編譯期間顯示它們的其他成員。 不過,為了讓程式代碼使用反映來存取通常無法存取的成員,例如私用或內部方法,或類別未繼承之類型的受保護字段,您的程式代碼必須具有 ReflectionPermission。 請參閱 反思的安全性考慮

Type 是允許多個實作的抽象基類。 系統一律會提供衍生類別 RuntimeType。 在反映中,所有以 Runtime 一詞開頭的類別只會在系統中為每個物件建立一次,並支援比較作業。

注意

在多線程案例中,請勿鎖定 Type 物件,以便同步處理數據的存取 static 。 沒有控制權的其他程式代碼也可能鎖定您的類別類型。 這可能會導致死結。 相反地,藉由鎖定私人 static 物件來同步存取靜態數據。

注意

衍生類別可以存取呼叫程式代碼基類的受保護成員。 此外,允許存取呼叫程式代碼元件的元件成員。 一般來說,如果您在早期綁定程式代碼中允許存取,則您也可以在晚期綁定程式代碼中允許存取。

注意

擴充其他介面的介面不會繼承擴充介面中定義的方法。

Type 物件代表哪些類型?

此類別是安全線程;多個線程可以同時從此類型的實例讀取。 類別的 Type 實體可以代表下列任何類型:

  • 類別
  • 值類型
  • 陣列
  • 介面
  • 列舉
  • 委派
  • 建構的泛型型別和泛型型別定義
  • 建構泛型型別、泛型型別定義和泛型方法定義的型別自變數和型別參數

擷取 Type 物件

Type您可以透過下列方式取得與特定類型相關聯的物件:

  • 實例 Object.GetType 方法會 Type 傳回 物件,代表實例的類型。 由於所有 Managed 型別都衍生自 ObjectGetType 因此可以在任何類型的實例上呼叫 方法。

    下列範例會呼叫 Object.GetType 方法來判斷物件陣列中每個物件的運行時間類型。

    object[] values = { "word", true, 120, 136.34, 'a' };
    foreach (var value in values)
        Console.WriteLine("{0} - type {1}", value,
                          value.GetType().Name);
    
    // The example displays the following output:
    //       word - type String
    //       True - type Boolean
    //       120 - type Int32
    //       136.34 - type Double
    //       a - type Char
    
    let 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 Char
    
    Module 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.GetTypesModule.GetTypeModule.FindTypes 方法會傳回Type對象,這些物件代表模組中定義的型別。 第一個方法可用來取得模組中定義之所有公用和私用型別的物件陣列 Type 。 (您可以透過 Assembly.GetModuleAssembly.GetModules 方法,或 透過 屬性取得 的Type.Module實例Module

  • System.Reflection.Assembly物件包含許多方法,可擷取元件中定義的類別,包括 Assembly.GetTypeAssembly.GetTypesAssembly.GetExportedTypes

  • 方法 FindInterfaces 會傳回型別所支援的介面類型篩選清單。

  • 方法 GetElementType 會傳 Type 回代表 項目的物件。

  • GetInterfacesGetInterface 方法會傳回Type物件,代表型別所支援的介面類型。

  • 方法 GetTypeArray 會傳回 物件的陣列 Type ,代表任意物件集所指定的型別。 物件是使用 型 Object別 的陣列來指定。

  • GetTypeFromProgIDGetTypeFromCLSID 方法會針對 COM 互操作性提供。 它們會傳Type回 物件,代表 或CLSIDProgID指定的型別。

  • 方法 GetTypeFromHandle 是為了互操作性而提供。 它會傳 Type 回 物件,代表類別句柄所指定的型別。

  • C# typeof 運算子、C++ typeid 運算子和 Visual Basic GetType 運算子會取得 Type 類型的 物件。

  • MakeGenericType方法會傳Type回 物件,表示建構的泛型型別,如果其 ContainsGenericParameters 屬性傳true回 ,則為開放式建構型別,否則為封閉式建構型別。 只有在關閉泛型類型時,才能具現化。

  • MakeArrayTypeMakePointerTypeMakeByRefType 方法會分別傳回Type對象,這些物件分別代表指定類型的陣列、指定類型的指標,以及參考參數的類型(ref在 C#中,在 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: {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()));

// 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