Attribute在.net編程中的應用整理(二)

.NET Framework中對Attribute的支持是一個全新的功能,這種支持來自它的Attribute類。在你的程序中適當地使用這個類,或者是靈活巧妙地利用這個類,將使你的程序獲得某種在以往編程中很難做到的能力。我們來看一個例子:假如你是一個項目開發小組中的成員,你想要跟蹤項目代碼檢查的信息,通常你可以把代碼的檢查信息保存在數據庫中以便查詢;或者把信息寫到代碼的註釋裏面,這樣可以閱讀代碼的同時看到代碼被檢查的信息。我們知道.NET的組件是自描述的,那麼是否可以讓代碼自己來描述它被檢查的信息呢?這樣我們既可以將信息和代碼保存在一起,又可以通過代碼的自我描述得到信息。答案就是使用Attribute. 下面的步驟和代碼告訴你怎麼做:首先,我們創建一個自定義的Attribute,並且事先設定我們的Attribute將施加在class的元素上面以獲取一個類代碼的檢查信息。

  1. using System;   
  2.   
  3. using System.Reflection;   
  4.   
  5.     
  6.   
  7. [AttributeUsage(AttributeTargets.Class)] //還記得上一節的內容嗎?   
  8.   
  9. public class CodeReviewAttribute : System.Attribute //定義一個CodeReview的Attribute   
  10.   
  11. {   
  12.   
  13.  private string reviewer;  //代碼檢查人   
  14.   
  15.  private string date;      //檢查日期   
  16.   
  17.  private string comment;   //檢查結果信息   
  18.   
  19.   
  20.   
  21.  //參數構造器   
  22.   
  23.  public CodeReviewAttribute(string reviewer, string date)   
  24.   
  25.  {   
  26.   
  27.   this.reviewer=reviewer;   
  28.   
  29.   this.date=date;   
  30.   
  31.  }   
  32.   
  33.   
  34.   
  35.  public string Reviewer   
  36.   
  37.  {   
  38.   
  39.   get  
  40.   
  41.   {   
  42.   
  43.    return reviewer;   
  44.   
  45.   }   
  46.   
  47.  }   
  48.   
  49.   
  50.   
  51.  public string Date   
  52.   
  53.  {   
  54.   
  55.   get  
  56.   
  57.   {   
  58.   
  59.    return date;   
  60.   
  61.   }   
  62.   
  63.  }   
  64.   
  65.   
  66.   
  67.  public string Comment   
  68.   
  69.  {   
  70.   
  71.   get  
  72.   
  73.   {   
  74.   
  75.    return comment;   
  76.   
  77.   }   
  78.   
  79.   set  
  80.   
  81.   {   
  82.   
  83.    comment=value;   
  84.   
  85.   }   
  86.   
  87.  }   
  88.   
  89. }  
using System;

using System.Reflection;

 

[AttributeUsage(AttributeTargets.Class)] //還記得上一節的內容嗎?

public class CodeReviewAttribute : System.Attribute //定義一個CodeReview的Attribute

{

 private string reviewer;  //代碼檢查人

 private string date;      //檢查日期

 private string comment;   //檢查結果信息



 //參數構造器

 public CodeReviewAttribute(string reviewer, string date)

 {

  this.reviewer=reviewer;

  this.date=date;

 }



 public string Reviewer

 {

  get

  {

   return reviewer;

  }

 }



 public string Date

 {

  get

  {

   return date;

  }

 }



 public string Comment

 {

  get

  {

   return comment;

  }

  set

  {

   comment=value;

  }

 }

}

我們的自定義CodeReviewAttribute同普通的類沒有區別,它從Attribute派生,同時通過AttributeUsage表示我們的Attribute僅可以施加到類元素上。

第二步就是使用我們的CodeReviewAttribute, 假如我們有一個Jack寫的類MyClass,檢查人Niwalker,檢查日期2003年7月9日,於是我們施加Attribute如下:

  1. [CodeReview("Niwalker","2003-7-9",Comment="Jack的代碼")]   
  2.   
  3. public class MyClass   
  4.   
  5. {   
  6.   
  7.  //類的成員定義   
  8.   
  9. }  
[CodeReview("Niwalker","2003-7-9",Comment="Jack的代碼")]

public class MyClass

{

 //類的成員定義

}

當這段代碼被編譯的時候,編譯器會調用CodeReviewAttribute的構造器並且把"Niwalker"和"2003-7-9"分別作爲構造器的參數。注意到參數表中還有一個Comment屬性的賦值,這是Attribute特有的方式,這裏你可以設置更多的Attribute的公共屬性(如果有的話),需要指出的是.NET Framework1.0允許向private的屬性賦值,但在.NET Framework1.1已經不允許這樣做,只能向public的屬性賦值。

第三步就是取出我們需要的信息,這是通過.NET的反射來實現的,關於反射的知識,限於篇幅我不打算在這裏進行說明,也許我會在以後另外寫一篇介紹反射的文章。

  1. class test   
  2.   
  3. {   
  4.   
  5.    static void Main(string[] args)   
  6.   
  7.    {   
  8.   
  9.       System.Reflection.MemberInfo info=typeof(MyClass); //通過反射得到MyClass類的信息   
  10.   
  11.   
  12.   
  13. //得到施加在MyClass類上的定製Attribute    
  14.   
  15.       CodeReviewAttribute att=   
  16.   
  17.                  (CodeReviewAttribute)Attribute.GetCustomAttribute(info,typeof(CodeReviewAttribute));    
  18.   
  19.       if(att!=null)   
  20.   
  21.       {   
  22.   
  23.           Console.WriteLine("代碼檢查人:{0}",att.Reviewer);   
  24.   
  25.           Console.WriteLine("檢查時間:{0}",att.Date);   
  26.   
  27.           Console.WriteLine("註釋:{0}",att.Comment);   
  28.   
  29.       }   
  30.   
  31.    }   
  32.   
  33. }  
class test

{

   static void Main(string[] args)

   {

      System.Reflection.MemberInfo info=typeof(MyClass); //通過反射得到MyClass類的信息



//得到施加在MyClass類上的定製Attribute 

      CodeReviewAttribute att=

                 (CodeReviewAttribute)Attribute.GetCustomAttribute(info,typeof(CodeReviewAttribute)); 

      if(att!=null)

      {

          Console.WriteLine("代碼檢查人:{0}",att.Reviewer);

          Console.WriteLine("檢查時間:{0}",att.Date);

          Console.WriteLine("註釋:{0}",att.Comment);

      }

   }

}

在上面這個例子中,Attribute扮演着向一個類添加額外信息的角色,它並不影響MyClass類的行爲。通過這個例子,我們大致可以知道如何寫一個自定義的Attribute,以及如何在應用程序使用它。下一節,我將介紹如何使用Attribute來自動生成ADO.NET的數據訪問類的代碼。(待續)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章