.Net Attribute特性

1.特性Attribute不能和属性Property混为一谈, 这是完全不同的两个东西.

2.特性Attribute给类或方法标识的内容, 可以在程序运行的时侯, 通过反射获取到.

   例如1: .net添加的单元测试类, 里面有TestClass标识,里面的方法有TestMethod标识, 当用户想运行测试用例时, 一点按钮, 所有的测试用例类, 每个类中的测试方法就都显示在面前, 用户可以自由的选择运行哪些测试类及类中的哪些测试方法, 这是怎么做到的, 相信就是.net通过反射得到所有的TestClass标识的类, 做成一个list显示给用户, 点开这个类, 再通过反射得到所有该类中有TestMethod标识的方法, 再显示给用户, 就这样做到的.

   例如2:[Obsolete("这是一个过时的方法")] 加在一个方法或类前时,编译器能提示您这是一个过时的方法,如何做到的?肯定是编译程序时要扫描方法前是否有这个标志,如果有,就给记录下来,显示出来。

3.特性Attribute这个东西类似静态的常量, 属于类所有, 不隶属于每一个特定的对象, 如果没有特性Attribute这个东西, 很多事情就很难做到.

4.内置的三个重要特性Attribute和一个枚举enum AttributeTargets

   AttributeUsage
   ComVisible
   SerializableAttribute

   后两个特性实际上代码很简单,就是一个标志, 如SerializableAttribute。

namespace System
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Delegate, Inherited = false)]
    [ComVisible(true)]
    public sealed class SerializableAttribute : Attribute
    {
        public SerializableAttribute();
    }
}

     AttributeUsage比较重要,有三个重要的参数可以设置,

     AttributeTargets 这是一个枚举,列出了自定义特性可以用来修饰谁,Class, interface 或者全都可以,多个中间用|隔开。如果你用一个只允许AttributeTargets.Class的特性修饰一个interface去,那注定编译失败。

[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)]

 

     AllowMultiple 表示是否可以重复放置此特性来修饰一个方法或类。

    [Lzd(Name = "Animal")]
    [Lzd(Name = "Animals")]
    public class Animal
    {
        ...
    }

     Inherited 表示是否可以被继承

     如果Inherited = false,则派生类继承不了特性。

     如果Inherited = true, 派生类可以继承特性,但是,如果AllowMultiple = false, 那么,如果派生类自己也加了同样的特性,则父类的特性会被屏蔽。

 

     参考了下面仁兄的文章:http://www.stuhack.com/biancheng/c_/8272.html

 

posted on 2011-07-08 11:21  BobLiu  阅读(944)  评论(0编辑  收藏  举报