• .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

    作者:BobLiu
    邮箱:lzd_ren@hotmail.com
    出处:http://www.cnblogs.com/liuzhendong
    本文版权归作者所有,欢迎转载,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    正则表达式替换所有符合条件的字符
    关于jquery ajax不执行success回调函数
    关于jquery绑定事件执行两次
    同步选中所有checkbox
    Jquery动态改变my97datepicker的日期形式
    关于button在td中时,zclip复制不能的问题
    关于各种高度的获取方法
    慎用--skip-grant-tables命令
    Mysql中判断是否存在
    前端html
  • 原文地址:https://www.cnblogs.com/liuzhendong/p/2100812.html
Copyright © 2020-2023  润新知