详解C# 反射(Reflection)

2020-06-29 19:00:50王冬梅

实例

在本实例中,我们将使用在上一章中创建的 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();
   }
  }
}