Réflexion dans .NET
Les classes de l’espace de noms System.Reflection avec System.Type vous permettent d’obtenir des informations sur les assemblys chargés et sur les types définis dans ceux-ci, comme les types des classes, des interfaces et des valeurs (à savoir des structures et des é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.
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
ouprivate
) et les détails d'implémentation (commeabstract
ouvirtual
) 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 telles que le nom, le type de retour, les paramètres, les modificateurs d’accès et les détails d’implémentation (tels que
abstract
ouvirtual
) 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 telles que le nom, les modificateurs d’accès et les détails d’implémentation (tels que
static
) d’un champ, et d’obtenir ou de définir les valeurs d’un 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 lorsque vous travaillez dans un MetadataLoadContext ou un contexte de réflexion uniquement (.NET Framework). 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 types de navigateurs, qui permettent aux utilisateurs de sélectionner des types et d’afficher ensuite les informations relatives à 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.