.Net:自定义特性(Custom Attributes)的创建与查看

有时候,我们会看到这样的东西放在类或者方法上面:

          [Obsolete("请更新方法")]

刚开始的时候,还自己给它起了个名字——小标签,比如,平常会说:你数据契约是不是没打标签啊!~嘿嘿~ 后来跟代码发现了更多的不认识的自定义标签。那么,这些标签是怎么定义和使用的呢?

定义Attribute

如下,定义了一个用于记录类变更的attribute,不允许继承,允许多次使用。

 [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] //
   public class RecordAttribute:Attribute
    {
       private string recordType;//记录类型:更新/创建
       private string author;//作者
       private DateTime date;//创建/更新日期
       private string memo;//备注

       //构造函数,构造函数的参数在特性中也称为”位置参数“。
       public RecordAttribute(string recordType, string author, string date) {

           this.recordType = recordType;
           this.author = author;
           this.date = Convert.ToDateTime(date);
       }

       //对于位置参数,通常只提供get访问器
       public string RecordType { get { return recordType; } }
       public string Author { get { return author; } }
       public DateTime Date { get { return date; } }

       //构建一个属性,在特性中也叫”命名参数“
       public string Memo {
           get { return memo; }
           set { memo = value; }
       }
    }

在类上使用的时候:

    [Record("创建","lhc","2015年4月25日 15:38:24",Memo="这里是备注信息")]
    [Record("修改", "lhc", "2015年4月25日 15:38:24", Memo = "这里是备注信息")]  

    public sealed class DemoClass : BaseClass, IDemoInterface, IdemoInterface2 {

        private string name;
        private string city;
        public  readonly string title;
        public const string text = "const field";
        public event DemoDelegate myEvent;

        public string Name {

            private get { return name; }
            set { name = value; }

        }

        public DemoClass() {

            title = "Readonly field";

        }

        public class NestedClass { }

        public void SayGreeting(string name)
        {

            Console.WriteLine("morning:"+name);
        }

    }

不管是构造函数的参数还是属性,全部写到构造函数的圆括号中,对于构造函数的参数,必须采取构造函数参数的顺序和类型,因此叫做位置参数;对于属性,采用“属性=值”这样的格式,他们之间用逗号分隔,称作命名参数。

感觉对一个类的初始化信息都浓缩到了一行。。。压缩率蛮高的啊~

利用反射查看自定义特性

使用了attributes之后,我们就可以读取里面的信息了。基本思路跟获取类的元数据一样,先用取到type,然后,,嘿嘿,你懂得~要啥都有了。。。。

#region 利用反射查看自定义特性

                Type t = typeof(Test.DemoClass);
                Console.WriteLine("下面列出应用于{0}的RecordAttributes属性:" + t);

                //获取所有的ReocordAttributes特性
                object[] records = t.GetCustomAttributes(typeof(Test.RecordAttribute), false); //获取所有RecordAttribute标签

                foreach (Test.RecordAttribute item in records)
                {
                    Console.WriteLine("{0}", item.ToString());
                    Console.WriteLine("类型:{0}", item.RecordType);
                    Console.WriteLine("作者:{0}", item.Author);
                    Console.WriteLine("日期:{0}", item.Date.ToString());
                    if (!string.IsNullOrEmpty(item.Memo))
                    {
                        Console.WriteLine("备注:{0}",item.Memo);
                    }
                }

            #endregion
时间: 2024-10-16 02:28:37

.Net:自定义特性(Custom Attributes)的创建与查看的相关文章

THREE.js代码备份——webgl - custom attributes [lines](自定义字体显示、控制字图的各个属性)

<!DOCTYPE html> <html lang="en"> <head> <title>three.js webgl - custom attributes [lines]</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, user-scal

特性(Attributes)

特性(Attributes) 在 Swift 中有两种特性,分别用于修饰声明和类型.特性提供了有关声明和类型的更多信息.例如,使用 discardableResult 特性声明的函数,表明该函数虽然有返回值,但如果没有使用该返回值,编译器不会产生警告. 您可以通过以下方式指定一个特性,通过符号 @ 后跟特性的名称和特性接收的任何参数: @特性名 @特性名(特性参数) 有些声明特性通过接收参数来指定特性的更多信息以及它是如何修饰某个特定的声明的.这些特性的参数写在圆括号内,它们的格式由它们所属的特

自定义html的attributes

本代码来自Coursera的Angular课程,欢迎大家去参加课程.我节选出精华的片段,写到自己博客上. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>HTML5 Custom Attributes</title> </head> <body> <h1>HTML5 Custom Attributes<

Javascript 自定义事件 (custom event)

Javascript 中经常会用到自定义事件.如何创建一个简单的自定义事件呢?在创建自定义的事件之前,我们应该考虑一下和事件有关的东西.例如 click 事件,首先我们要能注册一个click事件(在一个button上绑定click事件),然后要能够触发这个事件,最后事件不需要的时候要能够移除事件. 我们可以借助JQuery 的方法来实现自定义事件,请看下面的例子: <div id="myDiv">myDiv</div> <script type="

自定义特性。配合枚举使用棒棒哒

1 /// <summary> 2 /// 自定义特性,比系统的display增加了一些参数 Created by ZhangQC 2015.08.19 3 /// </summary> 4 [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, 5 AllowMultiple = false, Inherited = false)] 6 public sealed class CustomAttrib

C#编程(七十一)---------- 自定义特性

自定义特性 在说自定义之前,有必要先介绍一些基本的概念. 元数据:就是C#中封装的一些类,无法修改,类成员的特性被称为元数据中的注释 1.什么是特性? (1)属性和特性的区别 属性:属性是面向对象思想里所说的封装在类里面的数据字段,Get,Set方法. 特性:就相当于类的元数据. 来看看官方解释? 特性是给指定的某一声明的一则附加的声明性信息. 允许类似关键字的描述声明.它对程序中的元素进行标注,如类型.字段.方法.属性等.从.net角度看,特性是一种 类,这些类继承于System.Attrib

Shader的自定义特性使用

使用自定义特性关键字,可以达到动态对Shader某一部分代码进行开关的操作 shader(定义了KEYWORD1特性): 定义:#pragma shader_feature KEYWORD1 判断:#ifdef KEYWORD1 Shader "Custom/NewSurfaceShader" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)",

C#自定义特性实例

元数据,就是C#中封装的一些类,无法修改.类成员的特性被称为元数据中的注释. 1.什么是特性   (1)属性与特性的区别  属性(Property):属性是面向对象思想里所说的封装在类里面的数据字段,Get,Set方法.  特性(Attribute):  官方解释:特性是给指定的某一声明的一则附加的声明性信息. 允许类似关键字的描述声明.它对程序中的元素进行标注,如类型.字段.方法.属性等.从.net角度看,特性是一种 类,这些类继承于System.Attribute类,用于对类.属性.方法.事

数据验证(自定义特性)

这几天在了解ef,看了几天云里雾里(我太菜了),但在vs2010中使用ef时我觉得有些东西还是很有意思的.自己便想到分装一个逻辑层的数据验证类 1.自定义特性 [AttributeUsage(AttributeTargets.Property)] public class CheckAttributes:Attribute { // 摘要: // 初始化类的新实例. public CheckAttributes(bool iskey, bool isnull) { this.EntityKeyP