Heim > Artikel > Backend-Entwicklung > [C#-Tutorial] C#-Reflexion
C# Reflection
Reflection-Objekt wird verwendet, um Typinformationen zur Laufzeit abzurufen. Diese Klasse befindet sich im System.Reflection-Namespace und bietet Zugriff auf die Metadaten eines laufenden Programms.
Der System.Reflection-Namespace enthält Klassen, mit denen Sie Informationen über Ihre Anwendung abrufen und Ihrer Anwendung dynamisch Typen, Werte und Objekte hinzufügen können.
Verwendungen von Reflection
Reflection hat die folgenden Verwendungszwecke:
Es ermöglicht die Anzeige von Attributinformationen zur Laufzeit.
Es ermöglicht die Inspektion verschiedener Typen in einer Sammlung sowie die Instanziierung dieser Typen.
Es ermöglicht die verzögerte Bindung von Methoden und Eigenschaften.
Es ermöglicht das Erstellen neuer Typen zur Laufzeit und die anschließende Verwendung dieser Typen zum Ausführen einiger Aufgaben.
Metadaten anzeigen
Wir haben im obigen Kapitel erwähnt, dass Sie Reflektion verwenden können, um Attributinformationen anzuzeigen.
Das MemberInfo-Objekt der System.Reflection-Klasse muss initialisiert werden, um Attribute zu erkennen, die sich auf die Klasse beziehen. Dazu können Sie ein Objekt der Zielklasse wie folgt definieren:
System.Reflection.MemberInfo info = typeof(MyClass);
Das folgende Programm demonstriert dies:
using System; [AttributeUsage(AttributeTargets.All)] public class HelpAttribute : System.Attribute { public readonly string Url; public string Topic // Topic 是一个命名(named)参数 { get { return topic; } set { topic = value; } } public HelpAttribute(string url) // url 是一个定位(positional)参数 { 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(); } } }
Wenn der obige Code kompiliert und ausgeführt wird, Es zeigt die benutzerdefinierten Eigenschaften an, die an die Klasse MyClass angehängt sind:
HelpAttribute
Instance
In diesem Beispiel verwenden wir die im vorherigen Kapitel erstellte DeBugInfo-Eigenschaft und verwenden Reflection, um die Metadaten zu lesen in der Rechteckklasse.
using System; using System.Reflection; namespace BugFixApplication { // 一个自定义属性 BugFix 被赋给类及其成员 [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 { // 成员变量 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); // 遍历 Rectangle 类的属性 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); } } // 遍历方法属性 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(); } } }
Wenn der obige Code kompiliert und ausgeführt wird, werden die folgenden Ergebnisse erzeugt:
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:
Das Obige ist der Inhalt von [c#-Tutorial] C#-Reflexion, mehr Für verwandte Inhalt, achten Sie bitte auf die chinesische PHP-Website (www.php.cn)!