Reflektion in .NET

Die Klassen im System.Reflection-Namespace ermöglichen Ihnen zusammen mit System.Type, Informationen zu geladenen Assemblys und den hierin definierten Typen wie Klassen, Schnittstellen und Werttypen (also Strukturen und Enumerationen) abzurufen. Sie können auch mithilfe von Reflektion Typeninstanzen zur Laufzeit erstellen, diese aufrufen und darauf zugreifen. Themen zu bestimmten Aspekten der Reflektion finden Sie unter Verwandte Themen am Ende dieser Übersicht.

Das Common Language Runtime-Ladeprogramm verwaltet Anwendungsdomänen, bei denen es sich um definierte Begrenzungen um Objekte im gleichen Anwendungsbereich handelt. Diese Verwaltung umfasst das Laden jeder Assembly in die geeignete Anwendungsdomäne und das Steuern des Speicherlayouts der Typenhierarchie in jeder Assembly.

Assemblys enthalten Module, Module enthalten Typen, und Typen enthalten Member. Mit der Reflektion werden Objekte bereitgestellt, die Assemblys, Module und Typen kapseln. Sie können mithilfe von Reflektion dynamisch eine Instanz eines Typen erzeugen, Typen an ein vorhandenes Objekt binden und Typinformationen eines vorhandenen Objekts abfragen. Sie können anschließend die Methoden des Typs aufrufen oder auf dessen Felder oder Eigenschaften zugreifen. Typische Verwendungen von Reflektionen umfassen die folgenden:

  • Verwenden Sie Assembly, um Assemblys zu definieren und zu laden, um Module zu laden, die im Assemblymanifest aufgeführt sind, und um einen Typ in seiner Assembly zu suchen und eine Instanz hiervon zu erstellen.

  • Verwenden Sie Module, um Informationen zu ermitteln, wie die Assembly, die das Modul enthält, und die Klassen im Modul. 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 (wie public oder private) und Details zur Implementierung (wie abstract oder virtual) für einen Konstruktor abzurufen. Verwenden Sie die GetConstructors- oder die GetConstructor-Methode eines Type, um einen bestimmten Konstruktor aufzurufen.

  • Verwenden Sie MethodInfo, um Informationen wie den Namen, den Rückgabetyp, die Parameter, die Zugriffsmodifizierer (wie public oder private) und Details zur Implementierung (wie abstract oder virtual) für eine Methode abzurufen. Verwenden Sie die GetMethods- oder die GetMethod-Methode eines Type, um eine bestimmte Methode aufzurufen.

  • Verwenden Sie FieldInfo, um Informationen wie den Namen, die Zugriffsmodifizierer (wie public oder private) und Details zur Implementierung (wie static) für ein Feld abzurufen oder die Feldwerte abzurufen oder festzulegen.

  • Verwenden Sie EventInfo, um Informationen wie den Namen, den Datentyp das Ereignishandlers, benutzerdefinierte Attribute, den Deklarationstyp und den reflektierten Typ eines Ereignisses abzurufen und 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.

  • Verwenden Sie ParameterInfo, um Informationen wie den Namen eines Parameters, den Datentyp, ob es sich um einen Eingabe- oder Ausgabeparameter handelt und die Position des Parameters in der Methodensignatur abzurufen.

  • Verwenden Sie CustomAttributeData, um Informationen zu benutzerdefinierten Attributen abzurufen, wenn Sie im ausschließlich reflektionsbezogenen Kontext einer Anwendungsdomäne arbeiten. CustomAttributeData ermöglicht Ihnen, Attribute zu überprüfen, ohne Instanzen hiervon erstellen zu müssen. Die Klassen des System.Reflection.Emit-Namespace stellen eine spezielle Form der Reflektion bereit, die es Ihnen ermöglicht, Typen zur Laufzeit zu erstellen.

Reflektionen können auch zum Erstellen von Anwendungen verwendet werden, die als Typbrowser bezeichnet werden und es dem Benutzer ermöglichen, Typen auszuwählen und dann Informationen zu diesen Typen anzuzeigen.

Dies ist eine weitere Verwendungsmöglichkeit von Reflektionen. Compiler für Sprachen wie JScript verwenden Reflektionen, um Symboltabellen zu erstellen. Die Klassen im System.Runtime.Serialization-Namespace verwenden Reflektionen, um auf Daten zuzugreifen und um festzustellen, welche Felder beibehalten werden. Die Klassen im System.Runtime.Remoting-Namespace verwenden Reflektionen indirekt über die Serialisierung.

Runtimetypen in Reflektion

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

Wenn Sie beispielsweise den C#-Operator typeof (GetType in Visual Basic) verwenden, um ein Type-Objekt abzurufen, handelt es sich in Wirklichkeit um ein RuntimeType-Objekt. RuntimeType ist von Type abgeleitet und stellt Implementierungen aller abstrakten Methoden bereit.

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

Titel BESCHREIBUNG
Anzeigen von Typinformationen Beschreibt die Type-Klasse und stellt Codebeispiele bereit, die zeigen, wie Type mit verschiedenen Reflektionsklassen verwendet wird, um Informationen zu Konstruktoren, Methoden, Feldern, Eigenschaften und Ereignissen abzurufen.
Reflektion und generische Typen Erläutert, wie die Reflektion die Typparameter und die Typargumente von generischen Typen und generischen Methoden behandelt.
Sicherheitsüberlegungen für die Reflektion Beschreibt die Regeln, die festlegen, bis zu welchem Grad Reflektion verwendet werden kann, um Typinformationen abzurufen und auf Typen zuzugreifen.
Dynamisches Laden und Verwenden von Typen Beschreibt die benutzerdefinierte Bindungsschnittstelle der Reflektion, die spätes Binden unterstützt.
Laden von Assemblys in den reflexionsbezogenen Kontext Beschreibt den reflektionsbezogenen Ladungskontext. Zeigt, wie eine Assembly geladen wird, wie der Kontext getestet und wie die Attribute überprüft werden, die im reflektionsbezogenen Kontext auf eine Assembly angewendet wurden.
How to: Untersuchen von Assemblyinhalten mithilfe von MetadataLoadContext Laden und Überprüfen von Assemblys mithilfe von MetadataLoadContext
Zugreifen auf benutzerdefinierte Attribute Zeigt, wie mithilfe der Reflektion das Vorhandensein von Attributen und Werten abgefragt werden kann.
Angeben vollqualifizierter Typnamen Beschreibt das Format von vollqualifizierten Typnamen mit den Begriffen von BNF (Backus-Naur Form) sowie die Syntax, die erforderlich ist, um Sonderzeichen, Assemblynamen, Zeiger, Verweise und Arrays anzugeben.
Verknüpfen mit einem Delegaten mit Reflektion Erläutert, wie ein Delegat für eine Methode erstellt und dieser Delegat mit einem Ereignis verknüpft wird. Beschreibt, wie eine Ereignisbehandlungsmethode zur Laufzeit mit DynamicMethod erstellt wird.
Ausgeben von dynamischen Methoden und Assemblys Erläutert, wie dynamische Assemblys und dynamische Methoden generiert werden.

Referenz