System.Type, klasa

Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.

Klasa Type jest głównym elementem System.Reflection funkcjonalności i jest podstawowym sposobem uzyskiwania dostępu do metadanych. Użyj elementów Type członkowskich, aby uzyskać informacje o deklaracji typu, o składowych typu (takich jak konstruktory, metody, pola, właściwości i zdarzenia klasy), a także moduł i zestaw, w którym jest wdrażana klasa.

Do użycia odbicia kodu nie są wymagane żadne uprawnienia, aby uzyskać informacje o typach i ich elementach członkowskich, niezależnie od ich poziomów dostępu. Do korzystania z odbicia w celu uzyskania dostępu do publicznych członków lub innych członków, których poziomy dostępu nie będą widoczne podczas normalnej kompilacji, nie są wymagane żadne uprawnienia. Jednak aby kod używał odbicia w celu uzyskania dostępu do składowych, które zwykle byłyby niedostępne, takie jak metody prywatne lub wewnętrzne, lub pola chronione typu, klasa nie dziedziczy, kod musi mieć wartość ReflectionPermission. Zobacz Zagadnienia dotyczące zabezpieczeń dotyczące Emocje ion.

Type jest abstrakcyjną klasą bazową, która umożliwia wiele implementacji. System zawsze zapewni klasę RuntimeTypepochodną . Odbicia wszystkie klasy rozpoczynające się od słowa Runtime są tworzone tylko raz na obiekt w systemie i obsługują operacje porównania.

Uwaga

W scenariuszach wielowątkowych nie blokuj Type obiektów w celu zsynchronizowania dostępu do static danych. Inny kod, nad którym nie masz kontroli, może również zablokować typ klasy. Może to spowodować zakleszczenie. Zamiast tego zsynchronizuj dostęp do danych statycznych przez zablokowanie obiektu prywatnego static .

Uwaga

Klasa pochodna może uzyskiwać dostęp do chronionych składowych klas bazowych wywołującego kodu. Ponadto dostęp jest dozwolony do zestawów członków zestawu zestawu kodu wywołującego. Jeśli dostęp jest dozwolony we wczesnym powiązaniu kodu, dostęp jest również dozwolony w kodzie z opóźnieniem.

Uwaga

Interfejsy rozszerzające inne interfejsy nie dziedziczą metod zdefiniowanych w interfejsach rozszerzonych.

Jakie typy reprezentuje obiekt Type?

Ta klasa jest bezpieczna wątkiem; wiele wątków może równocześnie odczytywać z wystąpienia tego typu. Wystąpienie Type klasy może reprezentować dowolny z następujących typów:

  • Klasy
  • Typy wartości
  • Tablice
  • Interfejsy
  • Wyliczenia
  • Delegaci
  • Konstruowane typy ogólne i definicje typów ogólnych
  • Argumenty typu i parametry typu skonstruowanych typów ogólnych, definicje typów ogólnych i definicje metod ogólnych

Pobieranie obiektu Typu

Type Obiekt skojarzony z określonym typem można uzyskać w następujący sposób:

  • Metoda wystąpienia Object.GetType zwraca Type obiekt reprezentujący typ wystąpienia. Ponieważ wszystkie typy zarządzane pochodzą z Objectmetody , GetType można wywołać metodę w wystąpieniu dowolnego typu.

    Poniższy przykład wywołuje metodę w Object.GetType celu określenia typu środowiska uruchomieniowego każdego obiektu w tablicy obiektów.

    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
    
  • Metody statyczne Type.GetType zwracają Type obiekt reprezentujący typ określony przez jego w pełni kwalifikowaną nazwę.

  • Metody Module.GetTypes, Module.GetTypei Module.FindTypes zwracają Type obiekty reprezentujące typy zdefiniowane w module. Pierwsza metoda może służyć do uzyskania tablicy Type obiektów dla wszystkich typów publicznych i prywatnych zdefiniowanych w module. (Wystąpienie klasy można uzyskać Module za pomocą Assembly.GetModule metody lub Assembly.GetModules lub za pomocą Type.Module właściwości ).

  • Obiekt System.Reflection.Assembly zawiera wiele metod pobierania klas zdefiniowanych w zestawie, w tym Assembly.GetType, Assembly.GetTypesi Assembly.GetExportedTypes.

  • Metoda FindInterfaces zwraca filtrowaną listę typów interfejsów obsługiwanych przez typ.

  • Metoda GetElementType zwraca Type obiekt reprezentujący element.

  • Metody GetInterfaces i GetInterface zwracają Type obiekty reprezentujące typy interfejsów obsługiwane przez typ.

  • Metoda GetTypeArray zwraca tablicę Type obiektów reprezentujących typy określone przez dowolny zestaw obiektów. Obiekty są określane za pomocą tablicy typu Object.

  • Metody GetTypeFromProgID i GetTypeFromCLSID są udostępniane na potrzeby współdziałania modelu COM. Zwracają Type obiekt reprezentujący typ określony przez obiekt ProgID lub CLSID.

  • Metoda GetTypeFromHandle jest udostępniana na potrzeby współdziałania. Zwraca Type obiekt reprezentujący typ określony przez uchwyt klasy.

  • Operator języka C# typeof , operator języka C++ typeid i operator języka Visual Basic GetType uzyskują Type obiekt dla typu.

  • Metoda MakeGenericType zwraca Type obiekt reprezentujący skonstruowany typ ogólny, który jest typem otwartym skonstruowanym, jeśli jego ContainsGenericParameters właściwość zwraca truewartość , a zamknięty typ skonstruowany inaczej. Typ ogólny można utworzyć tylko wtedy, gdy jest zamknięty.

  • Metody MakeArrayType, MakePointerTypei MakeByRefType zwracają Type obiekty reprezentujące odpowiednio tablicę określonego typu, wskaźnik do określonego typu i typ parametru odwołania (ref w języku C#, "byref" w języku F#, ByRef w Visual Basic).

Porównywanie obiektów typu pod kątem równości

Type Obiekt reprezentujący typ jest unikatowy, czyli dwa Type odwołania do obiektu odwołują się do tego samego obiektu, jeśli i tylko wtedy, gdy reprezentują ten sam typ. Umożliwia to porównanie Type obiektów przy użyciu równości odwołań. Poniższy przykład porównuje Type obiekty reprezentujące liczbę wartości całkowitych, aby określić, czy są one tego samego typu.

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