Partager via


Définition d'un type avec l'émission de réflexion

Les types sont définis dans la portée d'un module dynamique à l'aide de la méthode ModuleBuilder.DefineType. DefineType retourne un TypeBuilder. Dans cette rubrique, le nom de type est toujours un nom de chemin d'accès complet qui inclut l'espace de noms. Par exemple, si le nom de type est Aaa.Bbb.Ccc, Aaa.Bbb est considéré comme l'espace de noms.

L'émission de réflexion fournit les options suivantes pour définir des types :

  • Définition d'une classe ou d'une interface avec le nom spécifié.

  • Définition d'une classe ou d'une interface avec le nom et les attributs spécifiés.

  • Définition d'une classe avec le nom, les attributs et la classe de base spécifiés.

  • Définition d'une classe avec le nom, les attributs, la classe de base et le jeu d'interfaces implémenté par la classe spécifiés.

  • Définition d'une classe avec le nom, les attributs, la classe de base et la taille de compression spécifiés.

  • Définition d'une classe avec le nom, les attributs, la classe de base et la taille de la classe dans son ensemble spécifiés.

  • Définition d'une classe avec le nom, les attributs, la classe de base, la taille de compression et la taille de la classe dans son ensemble spécifiés.

Avant qu'un type soit utilisé, la méthode TypeBuilder.CreateType doit être appelée. CreateType complète la création du type. Après l'appel à CreateType, l'appelant peut instancier le type (à l'aide de la méthode Activator.CreateInstance) et appeler des membres du type (à l'aide de la méthode Type.InvokeMember). Il est erroné d'appeler des méthodes qui modifient l'implémentation d'un type suite à 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 méthode TypeBuilder.DefineTypeInitializer. DefineTypeInitializer retourne un ConstructorBuilder.

Les types imbriqués sont définis à l'aide d'une des méthodes TypeBuilder.DefineNestedType.

La méthode TypeBuilder.AddDeclarativeSecurity ajoute la sécurité déclarative à un type en cours de génération. AddDeclarativeSecurity peut être appelée plusieurs fois à chaque appel spécifiant une action de sécurité (telle que Demand, Assert, Deny) et un jeu d'autorisations auquel l'action s'applique.

Attributs

  • Les interfaces sont spécifiées en utilisant les attributs TypeAttributes.Interface et TypeAttributes.Abstract.

  • Les classes concrètes (les classes qui ne peuvent pas être développées) sont spécifiées en utilisant l'attribut TypeAttributes.Sealed.

  • Plusieurs attributs déterminent le type de visibilité. Consultez la description de l'énumération TypeAttributes.

  • Si TypeAttributes.LayoutSequential est spécifié, le chargeur de classe dispose les champs dans l'ordre dans lequel ils sont lus des métadonnées. Le chargeur de classe considère la taille de compression spécifiée, mais ignore tout offset de champ spécifié. Les métadonnées conservent l'ordre dans lequel les définitions des champs sont émises. Même lors d'une fusion, les métadonnées ne réorganisent pas les définitions des champs. Le chargeur honorera les offsets de champ spécifiés uniquement si TypeAttributes.ExplicitLayout est spécifié.

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. Cependant, 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 la méthode TypeBuilder soit dérivée de Type, certaines des méthodes abstraites définies dans la classe Type ne sont pas totalement implémentées dans TypeBuilder. Ces méthodes TypeBuilder lèvent NotSupportedException. Les fonctionnalités souhaitées peuvent être obtenues par la récupération du type créé à l'aide de Type.GetType ou Assembly.GetType et via une réflexion sur le type récupéré.

Voir aussi

Autres ressources

Utilisation de Émission de réflexion