Réflexion dans .NET

Les classes de l' System.Reflection espace de noms, ainsi que System.Type , vous permettent d’obtenir des informations sur les assemblys chargés et les types définis dans ceux-ci, tels que les classes, les interfaceset les types valeur (autrement dit, les structures et les énumérations). Vous pouvez également utiliser la réflexion pour créer des instances de types au moment de l'exécution, et pour les appeler et y accéder. Pour obtenir des informations sur des aspects spécifiques de la réflexion, consultez Rubriques connexes à la fin de cette vue d’ensemble.

Le chargeur du common language runtime gère les domaines d’application. Ceux-ci constituent des limites définies autour des objets qui ont la même portée d’application. Cette gestion comprend le chargement de chaque assembly dans le domaine d'application approprié et le contrôle de la disposition en mémoire de la hiérarchie des types dans chaque assembly.

Les assemblys contiennent des modules, les modules contiennent des types, et les types contiennent des membres. La réflexion fournit des objets qui encapsulent les assemblys, les modules et les types. Vous pouvez utiliser la réflexion pour créer dynamiquement une instance d'un type, pour lier le type à un objet existant ou pour obtenir le type d'un objet existant. Vous pouvez ensuite appeler les méthodes du type ou accéder à ses champs et à ses propriétés. Les utilisations courantes de la réflexion sont les suivantes :

  • Utilisez Assembly pour définir et charger des assemblys, charger les modules répertoriés dans le manifeste d'assembly, et pour localiser un type de cet assembly et créer une instance de celui-ci.

  • Utilisez Module pour découvrir des informations comme l'assembly qui contient le module et les classes de ce module. Vous pouvez également obtenir toutes les méthodes globales ou d'autres méthodes spécifiques non globales définies sur le module.

  • Utilisez ConstructorInfo pour découvrir des informations comme le nom, les paramètres, les modificateurs d'accès (comme public ou private) et les détails d'implémentation (comme abstract ou virtual) d'un constructeur. Utilisez la méthode GetConstructors ou GetConstructor d'un type Type pour appeler un constructeur spécifique.

  • Utilisez MethodInfo pour découvrir des informations comme le nom, le type de retour, les paramètres, les modificateurs d'accès (comme public ou private) et les détails d'implémentation (comme abstract ou virtual) d'une méthode. Utilisez la méthode GetMethods ou GetMethod d'un type Type pour appeler une méthode spécifique.

  • Utilisez FieldInfo pour découvrir des informations comme le nom, les modificateurs d'accès (comme public ou private) et les détails d'implémentation (comme static) d'un champ, et pour obtenir ou définir les valeurs du champ.

  • Utilisez EventInfo pour découvrir des informations comme le nom, le type de données du gestionnaire d'événements, les attributs personnalisés, le type déclarant et le type réfléchi d'un événement, et pour ajouter ou supprimer des gestionnaires d'événements.

  • Utilisez PropertyInfo pour découvrir des informations comme le nom, le type de données, le type déclarant, le type réfléchi, et l'état en lecture seule ou en écriture d'une propriété, et pour obtenir ou définir les valeurs de la propriété.

  • Utilisez ParameterInfo pour découvrir des informations comme le nom d'un paramètre, son type de données, si un paramètre est un paramètre d'entrée ou de sortie, et la position du paramètre dans la signature d'une méthode.

  • Utilisez CustomAttributeData pour découvrir des informations sur les attributs personnalisés quand vous travaillez dans le contexte de réflexion uniquement d'un domaine d'application. CustomAttributeData vous permet d'examiner des attributs sans créer des instances de ceux-ci.

Les classes de l'espace de noms System.Reflection.Emit fournissent une forme de réflexion spécialisée qui vous permet de créer des types au moment de l'exécution.

La réflexion peut également être utilisée pour créer des applications appelées explorateurs de types, qui permettent aux utilisateurs de sélectionner des types et d'afficher les informations sur ces types.

Il existe d'autres utilisations de la réflexion. Les compilateurs de langages comme JScript utilisent la réflexion pour construire des tables de symboles. Les classes de l'espace de noms System.Runtime.Serialization utilisent la réflexion pour accéder aux données et pour déterminer les champs à rendre persistants. Les classes de l'espace de noms System.Runtime.Remoting utilisent la réflexion indirectement via la sérialisation.

Types au moment de l'exécution dans la réflexion

La réflexion fournit des classes, comme Type et MethodInfo, pour représenter des types, des membres, des paramètres et d'autres entités de code. Cependant, quand vous utilisez la réflexion, vous ne travaillez pas directement avec ces classes, dont la plupart sont abstraites (MustInherit en Visual Basic). Au lieu de cela, vous utilisez des types fournis par le common language runtime (CLR).

Par exemple, quand vous utilisez l'opérateur C# typeof (GetType en Visual Basic) pour obtenir un objet Type, l'objet est réellement d'un type RuntimeType. RuntimeType dérive de Type et fournit des implémentation de toutes les méthodes abstraites.

Ces classes d'exécution sont internal (Friend en Visual Basic). Elles ne sont pas documentées distinctement de leurs classes de base, car leur comportement est décrit par la documentation de la classe de base.

Titre Description
Affichage des informations de type Décrit la classe Type et fournit des exemples de code qui montrent comment utiliser Type avec plusieurs classes de réflexion pour obtenir des informations sur les constructeurs, les méthodes, les champs, les propriétés et les événements.
Réflexion et types génériques Explique comment la réflexion gère les paramètres de types et les arguments de types des types génériques et des méthodes génériques.
Considérations sur la sécurité de la réflexion Décrit les règles qui déterminent à quel degré la réflexion peut être utilisée pour découvrir des informations sur les types et accéder aux types.
Chargement et utilisation dynamiques des types Décrit l’interface de liaison personnalisée de la réflexion qui prend en charge la liaison tardive.
Guide pratique pour charger des assemblys dans le contexte de réflexion uniquement Décrit le contexte de chargement de réflexion seule. Montre comment charger un assembly, tester le contexte et examiner les attributs appliqués à un assembly dans le contexte de réflexion uniquement.
Accès aux attributs personnalisés Montre l'utilisation de la réflexion pour déterminer l'existence et les valeurs des attributs.
Spécification des noms de types qualifiés complets Décrit le format des noms complets des types sous la forme Backus-Naur (BNF) et la syntaxe requise pour spécifier les caractères spéciaux, les noms d'assemblys, les pointeurs, les références et les tableaux.
Procédure : raccorder un délégué à l’aide de la réflexion Explique comment créer un délégué pour une méthode et raccorder le délégué à un événement. Explique comment créer une méthode de gestion d'événements à l'exécution à l'aide de DynamicMethod.
Émission d'assemblys et de méthodes dynamiques Explique comment générer des assemblys dynamiques et des méthodes dynamiques.

Informations de référence

System.Type

System.Reflection

System.Reflection.Emit