System.Reflection.Emit.TypeBuilder-Klasse

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.

So erstellen ein Arraytyp, Zeigertyp oder Byref-Typ für einen unvollständigen Typ, der durch dargestellt wird eine TypeBuilder -Objekts die MakeArrayType -Methode, MakePointerType -Methode, oder MakeByRefType Methode bzw.

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-Attributen TypeAttributes.Abstract angegeben.
  • Konkrete Klassen (Klassen, die nicht erweitert werden können) werden mithilfe des TypeAttributes.Sealed Attributs angegeben.
  • Mehrere Attribute bestimmen die Typsichtbarkeit. Weitere Informationen finden Sie in der Beschreibung der TypeAttributes Enumeration.
  • Wenn TypeAttributes.SequentialLayout angegeben, legt das Klassenladeprogramm Felder in der Reihenfolge an, in der sie aus Metadaten gelesen werden. Der Klassenladeprogramm berücksichtigt die angegebene Verpackungsgröße, ignoriert jedoch alle angegebenen Feldversatze. 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 Feldversätze nur, wenn TypeAttributes.ExplicitLayout angegeben.

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 abgeleitet wird Type, werden einige der abstrakten Methoden, die in der Type Klasse definiert sind, nicht vollständig in der TypeBuilder Klasse implementiert. Aufrufe dieser TypeBuilder Methoden lösen eine NotSupportedException Ausnahme aus. Die gewünschte Funktionalität kann abgerufen werden, indem der erstellte Typ mithilfe des Type.GetType abgerufenen Typs abgerufen oder Assembly.GetType reflektiert wird.