Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article fournit des remarques supplémentaires à la documentation de référence de 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.
L'émission de réflexion 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, utilisez respectivement la méthode MakeArrayType, la méthode MakePointerType, ou la méthode MakeByRefType.
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 est erroné d'invoquer des méthodes qui modifient l'implémentation d'un type après que CreateType a été appelé. 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 en utilisant les attributs TypeAttributes.Interface et TypeAttributes.Abstract.
- 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 si TypeAttributes.ExplicitLayout est défini.
Problèmes connus
- L’émission de réflexion 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 que TypeBuilder soit dérivée de Type, certaines des méthodes abstraites définies dans la classe Type ne sont pas entièrement implémentées dans la classe TypeBuilder. Les appels à ces méthodes TypeBuilder lèvent une exception NotSupportedException. Vous pouvez obtenir la fonctionnalité souhaitée en récupérant le type créé à l'aide de Type.GetType ou Assembly.GetType, puis en réfléchissant au type récupéré.