Freigeben über


System.Type-Klasse

Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.

Die Type Klasse ist der Stamm der System.Reflection Funktionalität und die primäre Möglichkeit für den Zugriff auf Metadaten. Verwenden Sie die Member zum Abrufen von Type Informationen zu einer Typdeklaration, zu den Membern eines Typs (z. B. Konstruktoren, Methoden, Felder, Eigenschaften und Ereignisse einer Klasse) sowie zum Modul und zur Assembly, in der die Klasse bereitgestellt wird.

Es sind keine Berechtigungen erforderlich, um Code für die Verwendung der Spiegelung zum Abrufen von Informationen zu Typen und deren Membern unabhängig von ihren Zugriffsebenen zu verwenden. Es sind keine Berechtigungen erforderlich, um Code für den Zugriff auf öffentliche Member oder andere Member zu verwenden, deren Zugriffsebenen sie während der normalen Kompilierung sichtbar machen würden. Damit Ihr Code jedoch auf Elemente zugreifen kann, auf die normalerweise nicht zugegriffen werden kann, z. B. private oder interne Methoden, oder geschützte Felder eines Typs, die Ihre Klasse nicht erbt, muss ihr Code aufweisen ReflectionPermission. Siehe Sicherheitsüberlegungen zur Reflexion.

Type ist eine abstrakte Basisklasse, die mehrere Implementierungen zulässt. Das System stellt immer die abgeleitete Klasse RuntimeTypebereit. In Reflexion werden alle Klassen, die mit dem Wort Runtime beginnen, nur einmal pro Objekt im System erstellt und unterstützen Vergleichsvorgänge.

Hinweis

Sperren Sie in Multithreading-Szenarien keine Type Objekte, um den Zugriff auf static Daten zu synchronisieren. Anderer Code, über den Sie keine Kontrolle haben, kann auch den Klassentyp sperren. Dies kann zu einem Deadlock führen. Synchronisieren Sie stattdessen den Zugriff auf statische Daten, indem Sie ein privates static Objekt sperren.

Hinweis

Eine abgeleitete Klasse kann auf geschützte Member der Basisklassen des aufrufenden Codes zugreifen. Außerdem ist der Zugriff auf Assemblymitglieder der Assembly des aufrufenden Codes zulässig. Wenn Sie in früh gebundenem Code zugriff haben, ist in der Regel auch der Zugriff im spät gebundenen Code zulässig.

Hinweis

Schnittstellen, die andere Schnittstellen erweitern, erben nicht die in den erweiterten Schnittstellen definierten Methoden.

Welche Typen stellt ein Type-Objekt dar?

Diese Klasse ist threadsicher; Mehrere Threads können gleichzeitig aus einer Instanz dieses Typs gelesen werden. Eine Instanz der Type Klasse kann einen der folgenden Typen darstellen:

  • Klassen
  • Werttypen
  • Arrays
  • Schnittstellen
  • Enumerationen
  • Delegaten
  • Erstellte generische Typen und generische Typdefinitionen
  • Typargumente und Typparameter konstruierter generischer Typen, generische Typdefinitionen und generische Methodendefinitionen

Abrufen eines Type-Objekts

Das Type einem bestimmten Typ zugeordnete Objekt kann auf folgende Weise abgerufen werden:

  • Die Instanzmethode Object.GetType gibt ein Type Objekt zurück, das den Typ einer Instanz darstellt. Da alle verwalteten Typen von Objectdiesem abgeleitet werden, kann die GetType Methode für eine Instanz eines beliebigen Typs aufgerufen werden.

    Im folgenden Beispiel wird die Object.GetType Methode aufgerufen, um den Laufzeittyp jedes Objekts in einem Objektarray zu bestimmen.

    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
    
  • Die statischen Type.GetType Methoden geben ein Type Objekt zurück, das einen durch den vollqualifizierten Namen angegebenen Typ darstellt.

  • Die Module.GetTypes, Module.GetTypeund Module.FindTypes Methoden geben Objekte zurück Type , die die in einem Modul definierten Typen darstellen. Die erste Methode kann verwendet werden, um ein Array von Type Objekten für alle öffentlichen und privaten Typen abzurufen, die in einem Modul definiert sind. (Sie können eine Instanz von Module über die Assembly.GetModule Oder-Methode Assembly.GetModules oder über die Type.Module Eigenschaft abrufen.)

  • Das System.Reflection.Assembly Objekt enthält eine Reihe von Methoden zum Abrufen der klassen, die in einer Assembly definiert sind, einschließlich Assembly.GetType, Assembly.GetTypesund Assembly.GetExportedTypes.

  • Die FindInterfaces Methode gibt eine gefilterte Liste von Schnittstellentypen zurück, die von einem Typ unterstützt werden.

  • Die GetElementType Methode gibt ein Type Objekt zurück, das das Element darstellt.

  • Die GetInterfaces Und GetInterface Methoden geben Objekte zurück Type , die die von einem Typ unterstützten Schnittstellentypen darstellen.

  • Die GetTypeArray Methode gibt ein Array von Type Objekten zurück, das die durch einen beliebigen Satz von Objekten angegebenen Typen darstellt. Die Objekte werden mit einem Array vom Typ Objectangegeben.

  • Die GetTypeFromProgID Methoden und GetTypeFromCLSID Methoden werden für die COM-Interoperabilität bereitgestellt. Sie geben ein Type Objekt zurück, das den durch ein oder CLSID.ProgID

  • Die GetTypeFromHandle Methode wird für die Interoperabilität bereitgestellt. Es gibt ein Type Objekt zurück, das den durch ein Klassenhandle angegebenen Typ darstellt.

  • Der C# typeof -Operator, der C++ typeid -Operator und der Visual Basic-Operator GetType rufen das Type Objekt für einen Typ ab.

  • Die MakeGenericType Methode gibt ein Type Objekt zurück, das einen konstruierten generischen Typ darstellt, bei dem es sich um einen offenen konstruierten Typ handelt, wenn seine ContainsGenericParameters Eigenschaft zurückgegeben truewird, und andernfalls ein geschlossener konstruierter Typ. Ein generischer Typ kann nur instanziiert werden, wenn er geschlossen ist.

  • Die MakeArrayType, MakePointerTypeund MakeByRefType die Methoden geben Objekte zurück Type , die ein Array eines angegebenen Typs, einen Zeiger auf einen angegebenen Typ und den Typ eines Referenzparameters darstellen (ref in C#, "byref" in F# ByRef in Visual Basic).

Vergleichen von Typobjekten für Gleichheit

Ein Type Objekt, das einen Typ darstellt, ist eindeutig. Das heißt, zwei Type Objektverweise verweisen auf dasselbe Objekt, wenn und nur, wenn sie denselben Typ darstellen. Dies ermöglicht den Vergleich von Objekten mithilfe der Type Referenzgleichheit. Im folgenden Beispiel werden die Objekte verglichen, die Type eine Reihe ganzzahliger Werte darstellen, um zu bestimmen, ob sie vom gleichen Typ sind.

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