Kelas System.Type

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Kelas Type adalah akar System.Reflection fungsionalitas dan merupakan cara utama untuk mengakses metadata. Gunakan anggota Type untuk mendapatkan informasi tentang deklarasi jenis, tentang anggota jenis (seperti konstruktor, metode, bidang, properti, dan peristiwa kelas), serta modul dan perakitan tempat kelas disebarkan.

Tidak ada izin yang diperlukan agar kode dapat menggunakan pantulan untuk mendapatkan informasi tentang jenis dan anggotanya, terlepas dari tingkat akses mereka. Tidak ada izin yang diperlukan agar kode menggunakan refleksi untuk mengakses anggota publik, atau anggota lain yang tingkat aksesnya akan membuatnya terlihat selama kompilasi normal. Namun, agar kode Anda menggunakan refleksi untuk mengakses anggota yang biasanya tidak dapat diakses, seperti metode privat atau internal, atau bidang yang dilindungi dari jenis kelas Anda tidak mewarisi, kode Anda harus memiliki ReflectionPermission. Lihat Pertimbangan Keamanan untuk Refleksi.

Type adalah kelas dasar abstrak yang memungkinkan beberapa implementasi. Sistem akan selalu menyediakan kelas RuntimeTypeturunan . Dalam refleksi, semua kelas yang dimulai dengan kata Runtime dibuat hanya sekali per objek dalam sistem dan mendukung operasi perbandingan.

Catatan

Dalam skenario multithreading, jangan mengunci Type objek untuk menyinkronkan akses ke static data. Kode lain, di mana Anda tidak memiliki kontrol, mungkin juga mengunci jenis kelas Anda. Ini dapat mengakibatkan kebuntuan. Sebagai gantinya, sinkronkan akses ke data statis dengan mengunci objek privat static .

Catatan

Kelas turunan dapat mengakses anggota yang dilindungi dari kelas dasar kode panggilan. Selain itu, akses diizinkan untuk mengumpulkan anggota perakitan kode panggilan. Sebagai aturan, jika Anda diizinkan mengakses dalam kode terikat awal, maka Anda juga diizinkan mengakses dalam kode yang terlambat terikat.

Catatan

Antarmuka yang memperluas antarmuka lain tidak mewarisi metode yang ditentukan dalam antarmuka yang diperluas.

Jenis apa yang diwakili objek Tipe?

Kelas ini aman; beberapa utas dapat dibaca secara bersamaan dari instans jenis ini. Instans Type kelas dapat mewakili salah satu jenis berikut:

  • Kelas
  • Jenis nilai
  • Larik
  • Antarmuka
  • Enumerasi
  • Delegasikan
  • Jenis generik yang dibuat dan definisi jenis generik
  • Ketik argumen dan parameter jenis jenis jenis generik yang dibangun, definisi jenis generik, dan definisi metode generik

Mengambil objek Jenis

Objek Type yang terkait dengan jenis tertentu dapat diperoleh dengan cara berikut:

  • Metode instans Object.GetTypeType mengembalikan objek yang mewakili jenis instans. Karena semua jenis terkelola berasal dari Object, GetType metode dapat dipanggil pada instans jenis apa pun.

    Contoh berikut memanggil Object.GetType metode untuk menentukan jenis runtime setiap objek dalam array objek.

    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
    
  • Metode statis Type.GetType mengembalikan Type objek yang mewakili jenis yang ditentukan oleh nama yang sepenuhnya memenuhi syarat.

  • Metode Module.GetTypes, Module.GetType, dan Module.FindTypes mengembalikan Type objek yang mewakili jenis yang ditentukan dalam modul. Metode pertama dapat digunakan untuk mendapatkan array Type objek untuk semua jenis publik dan privat yang ditentukan dalam modul. (Anda dapat memperoleh instans melalui ModuleAssembly.GetModule metode atau Assembly.GetModules , atau melalui Type.Module properti .)

  • Objek System.Reflection.Assembly berisi sejumlah metode untuk mengambil kelas yang ditentukan dalam rakitan, termasuk Assembly.GetType, , Assembly.GetTypesdan Assembly.GetExportedTypes.

  • Metode mengembalikan FindInterfaces daftar jenis antarmuka yang difilter yang didukung oleh jenis.

  • Metode GetElementType mengembalikan Type objek yang mewakili elemen .

  • Metode GetInterfaces dan GetInterface mengembalikan Type objek yang mewakili jenis antarmuka yang didukung oleh jenis.

  • Metode mengembalikan GetTypeArray array Type objek yang mewakili jenis yang ditentukan oleh sekumpulan objek arbitrer. Objek ditentukan dengan array jenis Object.

  • Metode GetTypeFromProgID dan GetTypeFromCLSID disediakan untuk interoperabilitas COM. Mereka mengembalikan Type objek yang mewakili jenis yang ditentukan oleh ProgID atau CLSID.

  • Metode GetTypeFromHandle ini disediakan untuk interoperabilitas. Ini mengembalikan Type objek yang mewakili jenis yang ditentukan oleh handel kelas.

  • Operator C# typeof , operator C++ typeid , dan operator Visual Basic GetType mendapatkan Type objek untuk jenis.

  • Metode mengembalikan MakeGenericType objek yang Type mewakili jenis generik yang dibangun, yang merupakan jenis konstruksi terbuka jika propertinya ContainsGenericParameters mengembalikan true, dan jenis konstruksi tertutup sebaliknya. Jenis generik hanya dapat dibuat jika ditutup.

  • Metode MakeArrayType, MakePointerType, dan MakeByRefType mengembalikan Type objek yang mewakili, masing-masing, array dari jenis tertentu, penunjuk ke jenis tertentu, dan jenis parameter referensi (ref dalam C#, 'byref' di F#, ByRef di Visual Basic).

Membandingkan objek jenis untuk kesetaraan

Objek Type yang mewakili jenis bersifat unik; yaitu, dua Type referensi objek merujuk ke objek yang sama jika dan hanya jika mewakili jenis yang sama. Ini memungkinkan perbandingan Type objek menggunakan kesetaraan referensi. Contoh berikut membandingkan Type objek yang mewakili sejumlah nilai bilangan bulat untuk menentukan apakah objek tersebut memiliki jenis yang sama.

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