.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



    





        

                 

目录
相关文章
|
5天前
|
JSON 安全 API
.net 自定义日志类
在.NET中,创建自定义日志类有助于更好地管理日志信息。示例展示了如何创建、配置和使用日志记录功能,包括写入日志文件、设置日志级别、格式化消息等。注意事项涵盖时间戳、日志级别、JSON序列化、线程安全、日志格式、文件处理及示例使用。请根据需求调整代码。
29 13
|
5月前
|
人工智能 开发框架 .NET
.NET技术的强大功能:.NET技术的基础特性、在现代开发中的应用、以及它如何助力未来的软件开发。
.NET技术是软件开发领域的核心支柱,以其强大功能、灵活性及安全性广受认可。本文分三部分解析:基础特性如多语言支持、统一运行时环境;现代应用如企业级与Web开发、移动应用、云服务及游戏开发;以及未来趋势如性能优化、容器化、AI集成等,展望.NET在不断变化的技术环境中持续发展与创新。
139 4
|
2月前
|
自然语言处理 物联网 图形学
.NET 技术凭借其独特的优势和特性,为开发者们提供了一种高效、可靠且富有创造力的开发体验
本文深入探讨了.NET技术的独特优势及其在多个领域的应用,包括企业级应用、Web应用、桌面应用、移动应用和游戏开发。通过强大的工具集、高效的代码管理、跨平台支持及稳定的性能,.NET为开发者提供了高效、可靠的开发体验,并面对技术更新和竞争压力,不断创新发展。
79 7
|
2月前
|
开发框架 .NET C#
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位。从企业应用到电子商务,再到移动开发,.NET 均展现出卓越性能,助力开发者提升效率与项目质量,推动行业持续发展。
36 4
|
3月前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
45 1
|
3月前
|
存储 编译器
.Net特性Attribute的高级使用
【10月更文挑战第14天】在.NET中,特性(Attribute)是一种强大的机制,用于在代码中添加元数据。本文介绍了特性的高级用法,包括自定义特性、通过反射读取特性、条件编译与特性结合、多个特性应用以及特性继承。通过示例展示了如何创建自定义特性类、应用自定义特性,并通过反射获取特性信息。此外,还介绍了如何利用条件编译符号实现不同版本的代码控制,以及如何在一个代码元素上应用多个特性。最后,探讨了如何通过`AttributeUsage`控制特性的继承行为。
|
3月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
5月前
|
开发框架 .NET Docker
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
|
5月前
|
数据采集 API 开发者
.NET 8新特性:使用ConfigurePrimaryHttpMessageHandler定制HTTP请求
在.NET 8中,通过`ConfigurePrimaryHttpMessageHandler`方法,开发者能更精细地控制HTTP请求,这对于构建高效爬虫尤为重要。此特性支持定制代理IP、管理Cookie与User-Agent,结合多线程技术,有效应对网络限制及提高数据采集效率。示例代码展示了如何设置代理服务器、模拟用户行为及并发请求,从而在遵守网站规则的同时,实现快速稳定的数据抓取。
.NET 8新特性:使用ConfigurePrimaryHttpMessageHandler定制HTTP请求
|
5月前
|
JSON API C#
闲话 .NET(6):.NET Core 各个版本的特性
闲话 .NET(6):.NET Core 各个版本的特性
135 0