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.

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 und Details zur Implementierung (wie abstract oder virtual) zu einer 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 und Implementierungsdetails (wie static) für ein Feld zu ermitteln 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 im MetadataLoadContext oder reflektionsbezogenen Kontext (.NET Framework) 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.

Reflexionen können auch zum Erstellen von Typbrowsern verwendet werden, die es Benutzern und Benutzerinnen 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.

Verweis