English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
La réflexion est la capacité du programme à accéder, détecter et modifier son propre état ou comportement.
Les assemblies contiennent des modules, les modules contiennent des types, et les types contiennent des membres. La réflexion fournit des objets pour encapsuler les assemblies, modules et types.
Vous pouvez utiliser la réflexion pour créer des exemples de types dynamiquement, lier un type à un objet existant ou obtenir un type à partir d'un objet existant. Ensuite, vous pouvez appeler les méthodes du type ou accéder à ses champs et propriétés.
Avantages :
1、La réflexion augmente la flexibilité et l'extensibilité du programme.
2、Réduire la couplage, améliorer la capacité d'auto-adaptation.
3、Il permet à un programme de créer et de contrôler des objets de n'importe quelle classe, sans avoir à encoder le classe cible en dur à l'avance.
Inconvénients :
1、Problèmes de performance : L'utilisation de la réflexion est essentiellement une opération d'interprétation, qui est beaucoup plus lente que le code direct lors de l'accès aux champs et méthodes. Par conséquent, le mécanisme de réflexion est principalement appliqué aux systèmes de cadre qui nécessitent une grande flexibilité et extensibilité, et n'est pas recommandé pour les programmes ordinaires.
2、L'utilisation de la réflexion peut flouer la logique interne du programme ; les programmeurs souhaitent voir la logique du programme dans le code source, mais la réflexion contourne la technique du code source, ce qui peut entraîner des problèmes de maintenance, et le code réflexion est plus complexe que le code direct correspondant.
Reflection (Réflexion) a les utilisations suivantes :
Il permet de visualiser les informations sur les caractéristiques (attributes) au moment de l'exécution.
Il permet d'examiner divers types dans un ensemble et de les instancier.
Il permet de lier à la fois des méthodes et des propriétés (property) de manière décalée.
Il permet de créer de nouveaux types au moment de l'exécution et d'exécuter diverses tâches avec ces types.
Nous avons mentionné précédemment dans le chapitre précédent que l'utilisation de la réflexion (Reflection) permet de visualiser les informations sur les caractéristiques (attributes).
System.Reflection de la classe MemberInfo Les objets doivent être initialisés pour découvrir les caractéristiques associées à la classe. Pour cela, vous pouvez définir un objet de la classe cible, comme suit :
System.Reflection.MemberInfo info = typeof(MyClass);
Le programme suivant montre cela :
using System; [AttributeUsage(AttributeTargets.All)] public class HelpAttribute : System.Attribute { public readonly string Url; public string Topic // Topic est un paramètre nommé { get { return topic; } set { topic = value; } } public HelpAttribute(string url) // url est un paramètre positionnel { this.Url = url; } private string topic; } [HelpAttribute("Informations sur la classe MyClass")] class MyClass { } namespace AttributeAppl { class Program { static void Main(string[] args) { System.Reflection.MemberInfo info = typeof(MyClass); object[] attributes = info.GetCustomAttributes(true); for (int i = 0; i < attributes.Length; i++) { System.Console.WriteLine(attributes[i]); } Console.ReadKey(); } } }
Lorsque le code ci-dessus est compilé et exécuté, il affiche les caractéristiques attachées à la classe MyClass de la caractéristique personnalisée :
HelpAttribute
Dans cet exemple, nous utiliserons ce que nous avons créé dans le chapitre précédent DeBugInfo caractéristiques, et utilise la réflexion (Reflection) pour les lire}} Rectangle Métadonnées de la classe.
using System; using System.Reflection; namespace BugFixApplication { // Une caractéristique personnalisée BugFix est assignée à la classe et à ses membres [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class DeBugInfo : System.Attribute { private int bugNo; private string developer; private string lastReview; public string message; public DeBugInfo(int bg, string dev, string d) { this.bugNo = bg; this.developer = dev; this.lastReview = d; } public int BugNo { get { return bugNo; } } public string Developer { get { return developer; } } public string LastReview { get { return lastReview; } } public string Message { get { return message; } set { message = value; } } } [DeBugInfo(45, "Zara Ali", "12/8/2012" Message = "Retour type non correspondant")] [DeBugInfo(49, "Nuha Ali", "10/10/2012" Message = "Variable non utilisée")] class Rectangle { // Variables membres protected double length; protected double width; public Rectangle(double l, double w) { length = l; width = w; } [DeBugInfo(55, "Zara Ali", "19/10/2012" Message = "Retour type non correspondant")] public double GetArea()}} { return length * width; } [DeBugInfo(56, "Zara Ali", "19/10/2012")] public void Display() { Console.WriteLine("Longueur: {0}", length); Console.WriteLine("Largeur: {0}", width); Console.WriteLine("Surface: {0}", GetArea()); } }//fin classe Rectangle class ExecuteRectangle { static void Main(string[] args) { Rectangle r = new Rectangle(4.5, 7.5); r.Display(); Type type = typeof(Rectangle); // Parcourir les caractéristiques de la classe Rectangle foreach (Object attributes in type.GetCustomAttributes(false)) { DeBugInfo dbi = (DeBugInfo)attributes; if (null != dbi) { Console.WriteLine("Numéro de bogue: {0}", dbi.BugNo); Console.WriteLine("Développeur: {0}", dbi.Developer); Console.WriteLine("Dernière révision: {0}", dbi.LastReview); Console.WriteLine("Remarques: {0}", dbi.Message); } } // Parcourir les caractéristiques des méthodes foreach (MethodInfo m in type.GetMethods()) { foreach (Attribute a in m.GetCustomAttributes(true)) { DeBugInfo dbi = (DeBugInfo)a; if (null != dbi) { Console.WriteLine("Numéro de bogue: {0}, pour Méthode: {1}", dbi.BugNo, m.Name); Console.WriteLine("Développeur: {0}", dbi.Developer); Console.WriteLine("Dernière révision: {0}", dbi.LastReview); Console.WriteLine("Remarques: {0}", dbi.Message); } } } Console.ReadLine(); } } }
Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :
Longueur : 4.5 Largeur : 7.5 Surface : 33.75 Numéro de bug : 49 Développeur : Nuha Ali Dernière révision : 10/10/2012 Remarques : Variable non utilisée Numéro de bug : 45 Développeur : Zara Ali Dernière révision : 12/8/2012 Remarques : Mismatch de type de retour Numéro de bug : 55, pour Méthode : GetArea Développeur : Zara Ali Dernière révision : 19/10/2012 Remarques : Mismatch de type de retour Numéro de bug : 56, pour Méthode : Display Développeur : Zara Ali Dernière révision : 19/10/2012 Remarques :