Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.
TypeBuilder ist die Stammklasse, die zum Steuern der Erstellung dynamischer Klassen in der Laufzeit verwendet wird. Es stellt eine Reihe von Routinen bereit, die zum Definieren von Klassen, Hinzufügen von Methoden und Feldern verwendet werden und die Klasse innerhalb eines Moduls erstellen. Ein Neues TypeBuilder kann aus einem dynamischen Modul erstellt werden, indem die ModuleBuilder.DefineType Methode aufgerufen wird, die ein TypeBuilder Objekt zurückgibt.
Reflection emit bietet die folgenden Optionen zum Definieren von Typen:
- Definieren Sie eine Klasse oder Schnittstelle mit dem angegebenen Namen.
- Definieren Sie eine Klasse oder Schnittstelle mit dem angegebenen Namen und Attributen.
- Definieren Sie eine Klasse mit dem angegebenen Namen, attributen und der Basisklasse.
- Definieren Sie eine Klasse mit dem angegebenen Namen, attributen, der Basisklasse und dem Satz von Schnittstellen, die die Klasse implementiert.
- Definieren Sie eine Klasse mit dem angegebenen Namen, attributen, der Basisklasse und der Verpackungsgröße.
- Definieren Sie eine Klasse mit dem angegebenen Namen, attributen, der Basisklasse und der Klassengröße als Ganzes.
- Definieren Sie eine Klasse mit dem angegebenen Namen, attributen, der Basisklasse, der Verpackungsgröße und der Klassengröße als Ganzes.
Wenn Sie einen Arraytyp, einen Zeigertyp oder einen Byref-Typ für einen unvollständigen Typ erstellen möchten, der durch ein TypeBuilder Objekt dargestellt wird, verwenden Sie die MakeArrayType Methode, MakePointerType Methode oder MakeByRefType Methode.
Bevor ein Typ verwendet wird, muss die TypeBuilder.CreateType Methode aufgerufen werden. CreateType schließt die Erstellung des Typs ab. Nach dem Aufruf von CreateType kann der Aufrufer den Typ mithilfe der Activator.CreateInstance Methode instanziieren und Member des Typs mithilfe der Type.InvokeMember Methode aufrufen. Es ist ein Fehler beim Aufrufen von Methoden, die die Implementierung eines Typs ändern, nachdem CreateType aufgerufen wurde. Die Common Language Runtime löst beispielsweise eine Ausnahme aus, wenn der Aufrufer versucht, einem Typ neue Member hinzuzufügen.
Ein Klasseninitialisierer wird mithilfe der TypeBuilder.DefineTypeInitializer Methode erstellt. DefineTypeInitializer gibt ein ConstructorBuilder Objekt zurück.
Geschachtelte Typen werden durch Aufrufen einer der TypeBuilder.DefineNestedType Methoden definiert.
Attribute
Die TypeBuilder Klasse verwendet die TypeAttributes Enumeration, um die Merkmale des zu erstellenden Typs weiter anzugeben:
- Schnittstellen werden mit den TypeAttributes.Interface- und TypeAttributes.Abstract-Attributen angegeben.
- Konkrete Klassen (Klassen, die nicht erweitert werden können) werden mithilfe des TypeAttributes.Sealed Attributs angegeben.
- Mehrere Attribute bestimmen die Typsichtbarkeit. Siehe die Beschreibung der TypeAttributes-Auflistung.
- Wenn TypeAttributes.SequentialLayout angegeben, legt das Klassenladeprogramm Felder in der Reihenfolge an, in der sie aus Metadaten gelesen werden. Der Klassenlader berücksichtigt die angegebene Packinggröße, ignoriert aber alle angegebenen Feld-Offsets. Die Metadaten behalten die Reihenfolge bei, in der die Felddefinitionen ausgegeben werden. Selbst bei einem Zusammenführen ordnen die Metadaten die Felddefinitionen nicht neu an. Das Ladeprogramm berücksichtigt die angegebenen Feldoffsets nur, wenn TypeAttributes.ExplicitLayout angegeben ist.
Bekannte Probleme
- Reflection emitt überprüft nicht, ob eine nicht abstrakte Klasse, die eine Schnittstelle implementiert, alle methoden implementiert hat, die in der Schnittstelle deklariert sind. Wenn die Klasse jedoch nicht alle in einer Schnittstelle deklarierten Methoden implementiert, wird die Klasse von der Laufzeit nicht geladen.
- Obwohl TypeBuilder von Type abgeleitet wird, sind einige der in der Klasse Type definierten abstrakten Methoden nicht vollständig in der Klasse TypeBuilder implementiert. Aufrufe dieser TypeBuilder Methoden lösen eine NotSupportedException Ausnahme aus. Die gewünschte Funktionalität können Sie abrufen, indem Sie den erstellten Typ mit Hilfe der Type.GetType oder Assembly.GetType abrufen und über den abgerufenen Typ reflektieren.