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

简介:                          有时候,我们会看到这样的东西放在类或者方法上面:                [Obsolete("请更新方法")]                     刚开始的时候,还自己给它起了个名字——小标签,比如,平常会说:你数据契约是不是没打标签啊!~嘿嘿~ 后来跟代码发现了更多的不认识的自定义标签。


            

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

              

          [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



    





        

                 

目录
相关文章
|
6月前
|
开发框架 JSON .NET
ASP.NET Core 自定义配置警告信息
自定义配置警告信息需要在 startup 类中的 ConfigureService 方法中进行配置示例: // 注册 控制器服务 services.AddControllers(configure: setup => { setup.ReturnHttpNotAcceptable = true; ...
42 0
|
7月前
|
XML 存储 JSON
使用自定义XML配置文件在.NET桌面程序中保存设置
本文将详细介绍如何在.NET桌面程序中使用自定义的XML配置文件来保存和读取设置。除了XML之外,我们还将探讨其他常见的配置文件格式,如JSON、INI和YAML,以及它们的优缺点和相关的NuGet类库。最后,我们将重点介绍我们为何选择XML作为配置文件格式,并展示一个实用的示例。
96 0
|
4月前
|
XML API 数据库
七天.NET 8操作SQLite入门到实战 - 第六天后端班级管理相关接口完善和Swagger自定义配置
七天.NET 8操作SQLite入门到实战 - 第六天后端班级管理相关接口完善和Swagger自定义配置
|
5月前
|
Windows
基于.Net Core实现自定义皮肤WidForm窗口
基于.Net Core实现自定义皮肤WidForm窗口
49 0
|
7月前
|
存储
.NET Core - 自定义配置数据源:低成本实现定制化配置方案
.NET Core - 自定义配置数据源:低成本实现定制化配置方案
|
7月前
.NET Core-自定义配置数据源
前面,我们学习了配置框架的4种配置方式,那么你知道如何实现自定义的配置数据源吗?知道如何低成本实现定制化配置方案吗?下面我们就一起来学习一下吧。
|
10月前
|
C#
.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法
.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法
122 0
|
12月前
|
开发框架 中间件 .NET
asp.net core 自定义中间件【以dapper为例】
asp.net core 自定义中间件【以dapper为例】
119 0
|
编解码 分布式计算 Java
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]
|
开发框架 JSON 前端开发
【C#】.net core2.1,自定义全局类对API接口和视图页面产生的异常统一处理
在开发一个网站项目时,异常处理和过滤功能是最基础的模块 本篇文章就来讲讲,如何自定义全局异常类来统一处理
204 0