C# 特性学习(二)

来源:互联网 发布:网络摄像监控 编辑:程序博客网 时间:2024/06/05 15:19

自定义了一个特性类:

   [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)]
    classWahAttribute:System.Attribute
    {
       private string description;

       public string Description
       {
           get { return description; }
           set { description = value; }
       }
       private string author;

       public string Author
       {
           get { return author; }
           set { author = value; }
       }
       public WahAttribute(string desc)
       {
           this.description = desc;
       }
    }

运用特性类:

namespace attributeDemo
{
    public classTeacher
    {
       private string name;

       public string Name
       {
           get { return name; }
           set { name = value; }
       }
       private int age;

       public int Age
       {
           get { return age; }
           set { age = value; }
       }
       private string sex;

       public string Sex
       {
           get { return sex; }
           set { sex = value; }
       }
       //只有用户名为wah的才可以调用此方法
       [Wah("this is my attribute test", Author = "wah", Description ="test")]
       public string getMessage()
       {
           return "好好学习,天天向上";
       }
       [Wah("this is with parameterstest",Author="wanggaihui",Description="test withparameters")]
       public int Test(int a,int b)
       {
           return a+b;
       }
    }
}

处理特性类:

       private void button_Click(object sender, EventArgs e)
       {
           //得到类型
           Type type = typeof(Teacher);
           //得到此类型所有方法
           MethodInfo[] methods = type.GetMethods();
           foreach (MethodInfo method in methods)
           {
               //得到此方法的所有特性
               object[] attributes = method.GetCustomAttributes(false);
               foreach (object o in attributes)
               {
                   //判断是否是自己定义的特性
                   if (o.GetType() == typeof(WahAttribute))
                   {
                       //强转取得值
                       WahAttribute waha = (WahAttribute)o;
                       this.listBox1.Items.Add("author=" + waha.Author);
                       this.listBox1.Items.Add("description=" + waha.Description);
                   }
               }
           }
       }

C#特性可以应用于各种类型和成员。加在类前面的是类特性,加在方法前面的是方法特性。无论他们被用在哪里,无论他们之间有什么区别,特性的最主要的目的就是自描述。并且因为特性是可以由自己定制的,而不仅仅局限于.net提供的那几个现成的,因此给C#程序开发带来了很大的灵活性。

 

 

我们还是借用生活中的例子来介绍C#的特性机制吧。

假设有一天你去坐飞机,你就必须提前去机场登机处换登机牌。登机牌就是一张纸,上面写着哪趟航班、由哪里飞往哪里以及你的名字、座位号等等信息,其实,这就是特性。它不需要你生理上包含这些属性(人类出现那会儿还没飞机呢),就像上面的HumanBase类没有IsSerializable这样的属性,特性只需要在类或方法需要的时候加上去就行了,就像你不总是在天上飞一样。

拿到了登机牌,就意味着你可以合法地登机起飞了。但此时你还不知道你要坐的飞机停在哪里,不用担心,地勤人员会开车送你过去,但是他怎么知道你是哪趟航班的呢?显然还是通过你手中的登机牌。所以,特性最大的特点就是自描述。

既然是起到描述的作用,那目的就是在于限定。就好比地勤不会把你随便拉到一架飞机跟前就扔上去了事,因为标签上的说明信息就是起到限定的作用,限定了目的地、乘客和航班,任何差错都被视为异常。如果前面的HumanBase不加上Serializable特性就不能在网络上传输

指定特性参数

如果找到这样的构造函数,编译器就会把指定的元数据传送给程序集。如果找不到,就生成一个这样的构造函数。如果找到一个这样的构造函数,编译器就会把指定的元数据传送给程序集。如果找不到就生成一个编译错误。如后面所述,反射会从程序集中读取元数据,并实例化他们表示的特性类。因此,编译器需要确保存在这样的构造函数,才能在运行期间实例化指定的特性

 

转自:http://blog.csdn.net/helloguonan/article/details/5912399

0 0
原创粉丝点击