浅析C#中的Attribute

C# 特性(Attribute)总结 特性的作用就是对程序中所标记元素的另加描述和限限制。就像生活中的坐火车的车票一样,对该行程进行了进一步描述(如哪个站,目的地,出发时间等),同时也对描述信息进行了限制(如你错过发车时间就不能上车),出现任何差错都会视为异常。 阅读详情

  最近用到了,所以静下心来找些资料看了一下,终于把这东西搞清楚了。

一.什么是Attribute

先看下面的三段代码:

1.自定义Attribute类:VersionAttribute

    [AttributeUsage(AttributeTargets.Class)]
    public class VersionAttribute : Attribute
    {
        public string Name { get; set; }
        public string Date { get; set; }
        public string Describtion { get; set; }
    }

2.使用自定义Attribute的Class:

    [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]
    public class MyCode
    {
        //...
    }

3.上面这个Class中的Attribute一般会被如何使用呢?

    class Program
    {
        static void Main(string[] args)
        {
            var info = typeof(MyCode);
            var classAttribute = (VersionAttribute)Attribute.GetCustomAttribute(info, typeof(VersionAttribute));
            Console.WriteLine(classAttribute.Name);
            Console.WriteLine(classAttribute.Date);
            Console.WriteLine(classAttribute.Describtion);
        }
    }

示例完毕!上面三段代码相信已经说明了Attribute大概是一个什么东西和怎么去用。

二.深入讨论Attribute

1.Attribute的概念定义

     关于Attribute概念的定义,我直接引用《你必须知道的.NET之特性和属性》中的一段来说明:

     MADN的定义为:公共语言运行时允许添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据(metadata)保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。

     我们简单的总结为:定制特性attribute,本质上是一个类,其为目标元素提供关联附加信息,并在运行期以反射的方式来获取附加信息。

噢,原来Attribute的目的是为元素提供关联附加信息。其中,上面第一段代码中“[AttributeUsage(AttributeTargets.Class)] ”说明了Attribute提供附加信息的元素是Class,所以如果上面第二段的代码改为:

public class MyCode
{
    [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]
    public void Test() { }
}

会出现编译错误。

2.Attribute作为编译指令

     Attribute类是在编译的时候被实例化的,而不是像通常的类那样在运行时候才实例化。所以在第三段代码中,你可以在没有实例化MyCode对象的情况下取到MyCode的Attribute信息。由于Attribute类是在编译的时候被实例化的,所以你还可以用外部工具维护这些Attribute信息。

3.Attribute与Property

     从中文来说,Attribute和Property的中文都叫“属性”,很容易让人混淆。现在的文章,Attribute一般翻译为”特性”,而Property称为“属性”。

     或许你会问,我用静态的Property/Field一样可以做到在不实例化的时候拿到一些信息,如果这样的话,Attribute又有什么存在意义呢?

1.Property:

     Property可以说是一个面向对象的概念,提供了对私有字段的访问封装,在C#中以get和set访问器方法实现对可读可写属性的操作,提供了安全和灵活的数据访问封装。比如:

    public class Robot
    {
        private string name = "";   //字段:Field
        public string Name          //属性:Property,对Field进行封装。
          {
            get { return name; }
            set { name = value; }
        }
    }

2.Attribute:

     Attribute的目标是:为元素提供附加信息。它的作用更类似于注释。

可以说,Property/Field和Attribute是两个完全不同的概念,虽然他们有些时候能做一样的事,但请记住,他们是从本质上就不同的两个东西。

三.实现自己的Attribute时需要注意的一些问题

1.自定义的Attribute必须直接或者间接继承System.Attribute。

2.这里有一个约定:所有自定义的特性名称都应该有个Attribute后缀。因为当你的Attribute施加到一个程序的元素上的时候,编译器先查找你的Attribute的定义,如果没有找到,那么它就会查找“Attribute名称"+Attribute的定义。如果都没有找到,那么编译器就报错。这就是为什么我可以再上面第一段代码中,定义一个VersionAttribute,但在第二段代码中,我使用却是Version这个Attribute。:>

下面是一些开发自定义Attribute时,可能需要用到的资料:

【1】Attribute可以关联的元素包括:

      程序集(assembly)、模块(module)、类型(type)、属性(property)、事件(event)、字段(field)、方法(method)、参数(param)、返回值(return)。例如:

    [assembly: Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]
    public class MyCode
    {
        //......
    }

用指定的前缀来表示特性所应用的目标元素,建议这样来处理,因为显式处理可以消除可能带来的二义性。

【2】AttributeTargets目标包括:

标记说明
All可以对任何应用程序元素应用属性。
Assembly可以对程序集应用属性。 
Class可以对类应用属性。
Constructor可以对构造函数应用属性。
Delegate可以对委托应用属性。
Enum可以对枚举应用属性。
Event可以对事件应用属性。
Field可以对字段应用属性。
GenericParameter可以对泛型参数应用属性。
Interface可以对接口应用属性。
Method可以对方法应用属性。
ModuleModule 指的是可移植的可执行文件(.dll 或 .exe),而非 Visual Basic 标准模块。
Parameter可以对参数应用属性。
Property可以对属性 (Property) 应用属性 (Attribute)。
ReturnValue可以对返回值应用属性。
Struct可以对结构应用属性,即值类型。

【3】AttributeUsageAttribute中的3个属性(Property)说明:

属性名说明
ValidOn该定位参数指定可在其上放置所指示的属性 (Attribute) 的程序元素。AttributeTargets 枚举数中列出了可在其上放置属性 (Attribute) 的所有可能元素的集合。可通过按位“或”运算组合多个 AttributeTargets 值,以获取所需的有效程序元素组合。
AllowMultiple该命名参数指定能否为给定的程序元素多次指定所指示的属性。
Inherited该命名参数指定所指示的属性能否由派生类和重写成员继承。

 

转载请说明出处,谢谢![hyddd(http://www.cnblogs.com/hyddd/)]

详解C#中的特性(Attribute) 阅读详情

相关推荐

MinecraftBukkit服务端鉴定插件

一个Minecraft服务端插件,版本1.12.2-1.16,基于Spigot,前置为AttributeAPI, 前置属性插件可选AttributePlus Sx-Attribute

我的世界服务器物品属性,[RPG][PCD]SX-Attribute——不止 34+种属性!支持mm掉落 品质随机属性系统![1.9-1.13]...

#配置文件版本MESSAGE_VERSION: 1.3.8#与玩家有关的消息#都可以在修改发送方式#例如 [TITLE] [ACTIONBAR] 消息#不写前缀则是普通消息框消息PLAYER:NO_REGISTER_SLOTS: '[SX-Attribute] &c服务器没有开启额外的槽位识别'NO_LEVEL_USE: '[SX-Attribute] &c你没有达到使用 &amp...

weixin_31574149的博客 7132

科研绘图实战:用Adobe Illustrator高效排版期刊论文图片

本文详细介绍了使用Adobe Illustrator高效排版科研论文图片的完整工作流。针对期刊投稿常见的图片格式问题,文章重点讲解了矢量图与位图的预处理、AI中的精准对齐与分布技巧、文字样式统一管理以及最终输出TIFF/PDF等符合出版要求的格式。掌握这套方法能确保图片满足高分辨率、规范字体和精确尺寸等期刊硬性标准,显著提升投稿效率。

tomato的博客 1433

浅析Attribute在C# WinForm控件开发中的使用

<br /> Attribute在C# WinForm控件开发中的使用是如何的呢?我们在之前的文章中提到了Attribute,那么具体的在开发实战中是如何运用的呢?需要注意什么呢?来让我们看看一个Attribute在C# WinForm控件开发中的使用的实例。<br />    Attribute在C# WinForm控件开发中的使用的实例<br />    这个类是直接从Control类派生出来的,自定义控件都是直接从Control类派生出来的。这个类定义了一个属性TextAlignment,用来控制文本

561

爱快路由(ikuai)多WAN口配置实战:提升网络带宽与稳定性

本文详细解析了爱快路由(ikuai)多WAN口配置的实战技巧,包括双线智能分流、毫秒级故障切换和带宽叠加利用等核心功能。通过七种配置方案和智能QoS策略,帮助企业提升网络带宽与稳定性,实现99.9%以上的高可用性。

weixin_30566063的博客 701

STM32F407通过SMBus协议精准读取BQ40Z50电池电量

本文详细介绍了STM32F407通过SMBus协议精准读取BQ40Z50电池电量的实现方法。从硬件连接到软件驱动开发,再到通信异常排查,提供了完整的解决方案。重点解析了SMBus协议的特殊时序要求、GPIO模拟驱动的关键代码,以及实际调试中的常见问题与对策,帮助开发者高效完成电池管理系统开发。

weixin_29189003的博客 253
上一篇: 关于Dll、Com组件、托管dll和非托管dll的理解
下一篇: 详解C#中的反射
hongyanjava
博客等级 码龄17年 12粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值