Bagikan melalui


Kelas System.Type

Nota

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

Kelas Type adalah akar fungsionalitas System.Reflection 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 rakitan 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 secara normal, seperti metode privat atau internal, atau bidang terlindungi dari jenis yang bukan pewarisan kelas Anda, kode Anda harus memiliki ReflectionPermission. Lihat Pertimbangan Keamanan untuk Refleksi pada.

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

Nota

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

Nota

Kelas turunan dapat mengakses anggota yang dilindungi dari kelas dasar kode panggilan. Selain itu, akses diberikan kepada anggota majelis dari majelis kode panggilan. Sebagai aturan, jika Anda diizinkan mengakses kode terikat awal, maka Anda juga diizinkan mengakses kode terikat akhir.

Nota

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

Jenis apa yang diwakili objek Tipe?

Kelas ini aman terhadap penggunaan oleh banyak utas; beberapa utas dapat secara bersamaan membaca dari instans jenis ini. Instans kelas Type dapat mewakili salah satu jenis berikut:

  • Kelas
  • Jenis nilai
  • Larik
  • Antarmuka
  • Enumerasi
  • Perwakilan
  • 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 Tipe

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

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

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

    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 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 objek Type yang mewakili jenis yang ditentukan oleh nama lengkapnya.

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

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

  • Metode FindInterfaces mengembalikan daftar jenis-jenis antarmuka yang telah difilter yang didukung oleh tipe tersebut.

  • Metode GetElementType mengembalikan objek Type yang mewakili elemen .

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

  • Metode GetTypeArray mengembalikan array objek Type 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 objek Type yang mewakili jenis yang ditentukan oleh ProgID atau CLSID.

  • Metode GetTypeFromHandle disediakan untuk interoperabilitas. Ini mengembalikan objek Type yang mewakili tipe yang ditentukan oleh pengendali kelas.

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

  • Metode MakeGenericType mengembalikan objek Type yang mewakili jenis generik yang dibangun, yang merupakan jenis konstruksi terbuka jika properti ContainsGenericParameters mengembalikan true, dan jenis konstruksi tertutup sebaliknya. Jenis generik hanya dapat diinstansiasi jika tipe tersebut tertutup.

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

Membandingkan objek jenis untuk kesetaraan

Objek Type yang mewakili jenis unik; artinya, dua referensi objek Type merujuk ke objek yang sama jika dan hanya jika mewakili jenis yang sama. Ini memungkinkan perbandingan objek Type menggunakan kesetaraan referensi. Contoh berikut membandingkan objek Type 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: {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