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的数据访问类的代码。(待续)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值