【c#教程】C# 反射(Reflection)

來源:互聯網
上載者:User

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)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.