Classe System.Reflection.Emit.TypeBuilder

Cet article vous offre des remarques complémentaires à la documentation de référence pour cette API.

TypeBuilder est la classe racine utilisée pour contrôler la création de classes dynamiques dans le runtime. Il fournit un ensemble de routines utilisées pour définir des classes, ajouter des méthodes et des champs, et créer la classe à l’intérieur d’un module. Un nouveau TypeBuilder peut être créé à partir d’un module dynamique en appelant la ModuleBuilder.DefineType méthode, qui retourne un TypeBuilder objet.

Réflexions’émission d’émission fournit les options suivantes pour définir des types :

  • Définissez une classe ou une interface avec le nom donné.
  • Définissez une classe ou une interface avec le nom et les attributs donnés.
  • Définissez une classe avec le nom, les attributs et la classe de base donnés.
  • Définissez une classe avec le nom, les attributs, la classe de base et l’ensemble d’interfaces que la classe implémente.
  • Définissez une classe avec le nom, les attributs, la classe de base et la taille d’emballage donnés.
  • Définissez une classe avec le nom, les attributs, la classe de base et la taille de classe dans son ensemble.
  • Définissez une classe avec le nom, les attributs, la classe de base, la taille d’emballage et la taille de classe dans son ensemble.

Pour créer un type de tableau, un type de pointeur ou un type byref pour un type incomplet représenté par un TypeBuilder objet, utilisez respectivement la méthode, MakePointerType la méthode ou MakeByRefType la MakeArrayType méthode.

Avant d’utiliser un type, la TypeBuilder.CreateType méthode doit être appelée. CreateType termine la création du type. Après l’appel à CreateType, l’appelant peut instancier le type à l’aide de la Activator.CreateInstance méthode et appeler des membres du type à l’aide de la Type.InvokeMember méthode. Il s’agit d’une erreur d’appel de méthodes qui modifient l’implémentation d’un type après l’appel de CreateType . Par exemple, le Common Language Runtime lève une exception si l’appelant tente d’ajouter de nouveaux membres à un type.

Un initialiseur de classe est créé à l’aide de la TypeBuilder.DefineTypeInitializer méthode. DefineTypeInitializer retourne un ConstructorBuilder objet.

Les types imbriqués sont définis en appelant l’une TypeBuilder.DefineNestedType des méthodes.

Attributs

La TypeBuilder classe utilise l’énumération TypeAttributes pour spécifier davantage les caractéristiques du type à créer :

  • Les interfaces sont spécifiées à l’aide des attributs et TypeAttributes.Abstract des TypeAttributes.Interface attributs.
  • Les classes concrètes (classes qui ne peuvent pas être étendues) sont spécifiées à l’aide de l’attribut TypeAttributes.Sealed .
  • Plusieurs attributs déterminent la visibilité du type. Consultez la description de l’énumération TypeAttributes .
  • S’il TypeAttributes.SequentialLayout est spécifié, le chargeur de classes présente les champs dans l’ordre dans lequel ils sont lus à partir de métadonnées. Le chargeur de classe considère la taille d’emballage spécifiée, mais ignore les décalages de champ spécifiés. Les métadonnées conservent l’ordre dans lequel les définitions de champ sont émises. Même dans une fusion, les métadonnées ne réorganiseront pas les définitions de champ. Le chargeur respecte les décalages de champ spécifiés uniquement s’il TypeAttributes.ExplicitLayout est spécifié.

Problèmes connus

  • Réflexions’émission d’émission ne vérifie pas si une classe non abstraite qui implémente une interface a implémenté toutes les méthodes déclarées dans l’interface. Toutefois, si la classe n’implémente pas toutes les méthodes déclarées dans une interface, le runtime ne charge pas la classe.
  • Bien qu’elle TypeBuilder soit dérivée Typede , certaines des méthodes abstraites définies dans la Type classe ne sont pas entièrement implémentées dans la TypeBuilder classe. Les appels à ces TypeBuilder méthodes lèvent une NotSupportedException exception. Vous pouvez obtenir la fonctionnalité souhaitée en récupérant le type créé à l’aide du Type.GetTypeAssembly.GetType type ou en reflétant le type récupéré.