C# - Réflexion
Réflexion les objets sont utilisés pour obtenir des informations de type lors de l'exécution. Les classes qui donnent accès aux métadonnées d'un programme en cours d'exécution se trouvent dans le System.Reflection espace de noms.
Le System.Reflection L'espace de noms contient des classes qui vous permettent d'obtenir des informations sur l'application et d'ajouter dynamiquement des types, des valeurs et des objets à l'application.
Applications de réflexion
La réflexion a les applications suivantes −
-
Il permet d'afficher les informations d'attribut au moment de l'exécution.
-
Il permet d'examiner différents types dans un assemblage et d'instancier ces types.
-
Il permet une liaison tardive aux méthodes et propriétés
-
Il permet de créer de nouveaux types lors de l'exécution, puis d'effectuer certaines tâches à l'aide de ces types.
Affichage des métadonnées
Nous avons mentionné dans le chapitre précédent qu'en utilisant la réflexion, vous pouvez afficher les informations d'attribut.
Les Informations sur les membres objet du System.Reflection class doit être initialisé pour découvrir les attributs associés à une classe. Pour ce faire, vous définissez un objet de la classe cible, comme −
System.Reflection.MemberInfo info = typeof(MyClass);
Le programme suivant le démontre −
using System; [AttributeUsage(AttributeTargets.All)] public class HelpAttribute : System.Attribute { public readonly string Url; public string Topic // Topic is a named parameter { get { return topic; } set { topic = value; } } public HelpAttribute(string url) // url is a positional parameter { this.Url = url; } private string topic; } [HelpAttribute("Information on the class 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(); } } }
Lorsqu'il est compilé et exécuté, il affiche le nom des attributs personnalisés attachés à la classe MyClass −
HelpAttribute
Exemple
Dans cet exemple, nous utilisons le DeBugInfo créé dans le chapitre précédent et utilisez la réflexion pour lire les métadonnées dans le Rectangle classe.
Démo en directusing System; using System.Reflection; namespace BugFixApplication { //a custom attribute BugFix to be assigned to a class and its members [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 = "Return type mismatch")] [DeBugInfo(49, "Nuha Ali", "10/10/2012", Message = "Unused variable")] class Rectangle { //member variables protected double length; protected double width; public Rectangle(double l, double w) { length = l; width = w; } [DeBugInfo(55, "Zara Ali", "19/10/2012", Message = "Return type mismatch")] public double GetArea() { return length * width; } [DeBugInfo(56, "Zara Ali", "19/10/2012")] public void Display() { Console.WriteLine("Length: {0}", length); Console.WriteLine("Width: {0}", width); Console.WriteLine("Area: {0}", GetArea()); } }//end class Rectangle class ExecuteRectangle { static void Main(string[] args) { Rectangle r = new Rectangle(4.5, 7.5); r.Display(); Type type = typeof(Rectangle); //iterating through the attribtues of the Rectangle class foreach (Object attributes in type.GetCustomAttributes(false)) { DeBugInfo dbi = (DeBugInfo)attributes; if (null != dbi) { Console.WriteLine("Bug no: {0}", dbi.BugNo); Console.WriteLine("Developer: {0}", dbi.Developer); Console.WriteLine("Last Reviewed: {0}", dbi.LastReview); Console.WriteLine("Remarks: {0}", dbi.Message); } } //iterating through the method attribtues foreach (MethodInfo m in type.GetMethods()) { foreach (Attribute a in m.GetCustomAttributes(true)) { DeBugInfo dbi = (DeBugInfo)a; if (null != dbi) { Console.WriteLine("Bug no: {0}, for Method: {1}", dbi.BugNo, m.Name); Console.WriteLine("Developer: {0}", dbi.Developer); Console.WriteLine("Last Reviewed: {0}", dbi.LastReview); Console.WriteLine("Remarks: {0}", dbi.Message); } } } Console.ReadLine(); } } }
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant −
Length: 4.5 Width: 7.5 Area: 33.75 Bug No: 49 Developer: Nuha Ali Last Reviewed: 10/10/2012 Remarks: Unused variable Bug No: 45 Developer: Zara Ali Last Reviewed: 12/8/2012 Remarks: Return type mismatch Bug No: 55, for Method: GetArea Developer: Zara Ali Last Reviewed: 19/10/2012 Remarks: Return type mismatch Bug No: 56, for Method: Display Developer: Zara Ali Last Reviewed: 19/10/2012 Remarks:
Langue C
- C# Hello World - Votre premier programme C#
- Mots-clés et identifiants C#
- Variables C# et types de données (primitifs)
- Opérateurs C#
- Opérateurs de bits et de décalage de bits C#
- Entrée et sortie de base C#
- Expressions, instructions et blocs C# (avec exemples)
- Commentaires C#
- Instruction de rupture C#