C# 反射(Reflection)
反射(Reflection) 對象用於在運行時擷取類型資訊。該類位於 System.Reflection 命名空間中,可訪問一個正在啟動並執行程式的中繼資料。
System.Reflection 命名空間包含了允許您擷取有關應用程式資訊及嚮應用程式動態添加類型、值和對象的類。
反射(Reflection)的用途
反射(Reflection)有下列用途:
它允許在運行時查看屬性(attribute)資訊。
它允許審查集合中的各種類型,以及執行個體化這些類型。
它允許延遲綁定的方法和屬性(property)。
它允許在運行時建立新類型,然後使用這些類型執行一些任務。
查看中繼資料
我們已經在上面的章節中提到過,使用反射(Reflection)可以查看屬性(attribute)資訊。
System.Reflection 類的 MemberInfo 對象需要被初始化,用於發現與類相關的屬性(attribute)。為了做到這點,您可以定義目標類的一個對象,如下:
System.Reflection.MemberInfo info = typeof(MyClass);
下面的程式示範了這點:
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(); } }}
當上面的代碼被編譯和執行時,它會顯示附加到類 MyClass 上的自訂屬性:
HelpAttribute
執行個體
在本執行個體中,我們將使用在上一章中建立的 DeBugInfo 屬性,並使用反射(Reflection)來讀取 Rectangle 類中的中繼資料。
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(); } }}
當上面的代碼被編譯和執行時,它會產生下列結果:
Length: 4.5Width: 7.5Area: 33.75Bug No: 49Developer: Nuha AliLast Reviewed: 10/10/2012Remarks: Unused variableBug No: 45Developer: Zara AliLast Reviewed: 12/8/2012Remarks: Return type mismatchBug No: 55, for Method: GetAreaDeveloper: Zara AliLast Reviewed: 19/10/2012Remarks: Return type mismatchBug No: 56, for Method: DisplayDeveloper: Zara AliLast Reviewed: 19/10/2012Remarks:
以上就是【c#教程】C# 反射(Reflection)的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!