Freigeben über


Spiegelung in .NET

Mit den Klassen im System.Reflection Namespace können Sie zusammen mit System.Typeihnen Informationen zu geladenen Assemblys und den darin definierten Typen abrufen, z. B. Klassen, Schnittstellen und Werttypen (d. b. Strukturen und Enumerationen). Sie können auch mithilfe von Reflektion Typeninstanzen zur Laufzeit erstellen, diese aufrufen und darauf zugreifen.

Assemblys enthalten Module, Module enthalten Typen, und Typen enthalten Mitglieder. Mit der Reflektion werden Objekte bereitgestellt, die Assemblys, Module und Typen kapseln. Mithilfe der Spiegelung können Sie eine Instanz eines Typs dynamisch erstellen, den Typ an ein vorhandenes Objekt binden oder den Typ aus einem vorhandenen Objekt abrufen. Anschließend können Sie die Methoden des Typs aufrufen oder auf die zugehörigen Felder und Eigenschaften zugreifen. Typische Verwendungen der Reflexion umfassen Folgendes:

  • Wird Assembly verwendet, um Assemblys zu definieren und zu laden, Module zu laden, die im Assemblymanifest aufgeführt sind, und einen Typ aus dieser Assembly zu suchen und eine Instanz davon zu erstellen.
  • Verwenden Sie Module , um Informationen wie die Assembly, die das Modul enthält, sowie die Klassen im Modul zu entdecken. Sie können auch alle globalen Methoden oder andere spezifische, nicht globale Methoden abrufen, die im Modul definiert sind.
  • Verwenden Sie ConstructorInfo, um Informationen wie den Namen, die Parameter, die Zugriffsmodifizierer (zum Beispiel public oder private) und Implementierungsdetails (zum Beispiel abstract oder virtual) eines Konstruktors zu entdecken. Verwenden Sie die GetConstructors oder GetConstructor methode eines Type , um einen bestimmten Konstruktor aufzurufen.
  • Verwenden Sie MethodInfo zum Ermitteln von Informationen wie Name, Rückgabetyp, Parametern, Zugriffsmodifizierern und Implementierungsdetails (z. B. abstract oder virtual) einer Methode. Verwenden Sie die GetMethods-Methode oder GetMethod-Methode eines Type, um eine bestimmte Methode aufzurufen.
  • Verwenden Sie FieldInfo , um Informationen zu ermitteln, wie den Namen, Zugriffsmodifizierer und Implementierungsdetails (z. B. static) eines Felds sowie Feldwerte abzurufen oder festzulegen.
  • Verwenden Sie EventInfo, um Informationen wie Namen, Ereignishandler-Datentyp, benutzerdefinierte Attribute, den deklarierenden Typ und den reflektierten Typ eines Ereignisses zu ermitteln sowie um Ereignishandler hinzuzufügen oder zu entfernen.
  • Verwenden Sie PropertyInfo, um Informationen wie den Namen, den Datentyp, den Deklarationstyp, den reflektierten Typ und die Status "Schreibgeschützt" oder "Beschreibbar" einer Eigenschaft abzurufen und um die Eigenschaftswert abzurufen oder festzulegen.
  • Wird verwendet ParameterInfo , um Informationen wie den Namen, den Datentyp eines Parameters, ob ein Parameter ein Eingabe- oder Ausgabeparameter ist, und die Position des Parameters in einer Methodensignatur zu ermitteln.
  • Verwenden Sie CustomAttributeData, um Informationen zu benutzerdefinierten Attributen abzurufen, wenn Sie im ausschließlich im MetadataLoadContext oder reflektionsbezogenen Kontext (.NET Framework) arbeiten. CustomAttributeData ermöglicht es Ihnen, Attribute zu untersuchen, ohne Instanzen davon zu erstellen.

Die Klassen des System.Reflection.Emit Namespace bieten eine spezielle Form der Reflexion, mit der Sie Typen zur Laufzeit erstellen können.

Spiegelung kann auch zum Erstellen von Typbrowsern verwendet werden, mit denen Benutzer Typen auswählen und dann die Informationen zu diesen Typen anzeigen können.

Es gibt noch andere Verwendungsmöglichkeiten für Reflexion. Compiler für Sprachen wie JScript verwenden Spiegelung zum Erstellen von Symboltabellen. Die Klassen im System.Runtime.Serialization Namespace verwenden Spiegelung, um auf Daten zuzugreifen und zu bestimmen, welche Felder beibehalten werden sollen. Die Klassen im System.Runtime.Remoting Namespace verwenden die Spiegelung indirekt durch Serialisierung.

Runtimetypen in Reflektion

Reflection stellt Klassen wie Type und MethodInfo, um Typen, Member, Parameter und andere Codeentitäten darzustellen. Wenn Sie jedoch Spiegelung verwenden, arbeiten Sie nicht direkt mit diesen Klassen, von denen die meisten abstrahieren (MustInherit in Visual Basic). Stattdessen arbeiten Sie mit Typen, die von der Common Language Runtime (CLR) bereitgestellt werden.

Wenn Sie beispielsweise den C# typeof -Operator (GetType in Visual Basic) zum Abrufen eines Type Objekts verwenden, ist das Objekt wirklich ein RuntimeType. RuntimeType abgeleitet von Type und stellt Implementierungen aller abstrakten Methoden bereit.

Diese Laufzeitklassen sind internal (Friend in Visual Basic). Sie werden nicht getrennt von ihren Basisklassen dokumentiert, da ihr Verhalten in der Basisklassendokumentation beschrieben wird.

Referenz