.NET中的Attribute(二)----理解

在前一篇文章我介绍了Attribute类的认识,现在我们更深入理解它,看看如何自定义Attribute类。
首先看看下面的例子from msdn:
using System;
using System.Reflection;

namespace CustomAttrCS {
 // An enumeration of animals. Start at 1 (0 = uninitialized).
 public enum Animal {
  // Pets.
  Dog = 1,
  Cat,
  Bird,
 }

 // A custom attribute to allow a target to have a pet.
 public class AnimalTypeAttribute : Attribute {
  // The constructor is called when the attribute is set.
  public AnimalTypeAttribute(Animal pet) {
   thePet = pet;
  }

  // Keep a variable internally ...
  protected Animal thePet;

  // .. and show a copy to the outside world.
  public Animal Pet {
   get { return thePet; }
   set { thePet = Pet; }
  }
 }

 // A test class where each method has its own pet.
 class AnimalTypeTestClass {
  [AnimalType(Animal.Dog)]
  public void DogMethod() {}

  [AnimalType(Animal.Cat)]
  public void CatMethod() {}

  [AnimalType(Animal.Bird)]
  public void BirdMethod() {}
 }

 class DemoClass {
  static void Main(string[] args) {
   AnimalTypeTestClass testClass = new AnimalTypeTestClass();
   Type type = testClass.GetType();
   // Iterate through all the methods of the class.
   foreach(MethodInfo mInfo in type.GetMethods()) {
    // Iterate through all the Attributes for each method.
    foreach (Attribute attr in
     Attribute.GetCustomAttributes(mInfo)) {
     // Check for the AnimalType attribute.
     if (attr.GetType() == typeof(AnimalTypeAttribute))
      Console.WriteLine(
       "Method {0} has a pet {1} attribute.",
       mInfo.Name, ((AnimalTypeAttribute)attr).Pet);
    }

   }
  }
 }
}

/*
 * Output:
 * Method DogMethod has a pet Dog attribute.
 * Method CatMethod has a pet Cat attribute.
 * Method BirdMethod has a pet Bird attribute.
 */

分析:
1、首先定义了一个枚举,它可以看成是可以关联到目标元素的属性(Attribute)信息,从而将自定义信息绑定到目标元素上。
2、定义自己的Attribute,这里所设定的属性Attribute要求目标元素要有一个pet(相当于是要有一个参数)以便进行正需的操作,这样就达到了对程序运行是的控制。这个类主要是一个构造函数和一个Property。(这种结构类似前面自定义配置节处理程序的结构)
   这里又要注意了,
(1)定义类的时候名称为AnimalTypeAttribute,而使用的时候变成了AnimalType这是允许的,因为Attribute的命名规范,也就是你的Attribute的类名+"Attribute",当你的Attribute施加到一个程序的元素上的时候,编译器先查找你的Attribute的定义,如果没有找到,那么它就会查找“Attribute名称"+Attribute的定义。如果都没有找到,编译器才就报错。
(2)由于是根据pet进行程序控制,换句话说程序是根据Attribute值pet来控制目标的执行的,那么在自定义的Attribute类中就要定义一个Property 类型为Animal,同时成员变量定义为内部访问,即protected Animal thePet;(注意protected关键字);
(3)自定义AnimalTypeAttribute类的构造函数是在该Attribute被设置后调用的。
3、定义一个需要由Attribute来控制执行各种方法的类AnimalTypeTestClass,比如在现实生活中我们根据红绿灯判断是前进还是等待等,方法上面有了自定义的Attribute的设置,这样在编译的时候自定义的AnimalTypeAttribute类被实例化了,也就是AnimalTypeAttribute中的构造函数被调用,从而知道pet到底是什么。
4、编写测试类,在这个类中我们首先实例化一个AnimalTypeTestClass类,然后得到这个类的类型信息(Type),再列出这个类中的所有方法,在根据些方法得到方法上的所有Attribute类(这里的Attribute还不一定全部是AnimalTypeAttribute,因为前面已经说了,在目标元素上可能不只一个Attribute),如果
Attibute类就是自己定义的AnimalTypeAttribute类,就直接输出方法的名字和上面施加的对应自定义Attribute的具体值(也就是属性值)。

这里这是谈了自定义Attribute类的简单情况,后面我还会继续说明一些比较复杂的情况。我力求根据我的理解将每一个细节都能讲到,希望你看了不觉得我啰嗦,因为我是初学者,所以还是老老实实记录下来,以便以后参考^_^

posted on 2008-03-18 03:51  Austin Bai  阅读(625)  评论(4编辑  收藏  举报

导航