浅析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 | 可以对方法应用属性。 |
Module | Module 指的是可移植的可执行文件(.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/)]
四.参考资料
【1】Msdn
【2】《你必须知道的.NET之特性和属性》,博主严重推荐!
【3】《Attribute在.net编程中的应用》系列文章
作者:hyddd
出处:http://www.cnblogs.com/hyddd/
本文版权归作者所有,欢迎转载,演绎或用于商业目的,但是必须说明本文出处(包含链接)。
浅析C#中的Attribute(转)的更多相关文章
- 浅析C#中的Attribute
原文地址:http://www.cnblogs.com/hyddd/archive/2009/07/20/1526777.html 一.什么是Attribute 先看下面的三段代码: 1.自定义Att ...
- 浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 浅析mongodb中group分组
这篇文章主要介绍了浅析mongodb中group分组的实现方法及示例,非常的简单实用,有需要的小伙伴可以参考下. group做的聚合有些复杂.先选定分组所依据的键,此后MongoDB就会将集合依据选定 ...
- 浅析py-faster-rcnn中不同版本caffe的安装及其对应不同版本cudnn的解决方案
浅析py-faster-rcnn中不同版本caffe的安装及其对应不同版本cudnn的解决方案 本文是截止目前为止最强攻略,按照本文方法基本可以无压力应对caffe和Ross B. Girshick的 ...
- 浅析JS中的模块规范(CommonJS,AMD,CMD)////////////////////////zzzzzz
浅析JS中的模块规范(CommonJS,AMD,CMD) 如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已. ...
- 浅析Java中的访问权限控制
浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...
- 关于C# 中的Attribute 特性
关于C# 中的Attribute 特性 作者: 钢钢 来源: 博客园 发布时间: 2011-01-09 23:30 阅读: 13921 次 推荐: 12 原文链接 [收藏] 摘要:纠结地说 ...
- C#中的Attribute
最近用到了,所以静下心来找些资料看了一下,终于把这东西搞清楚了. 一.什么是Attribute 先看下面的三段代码: 1.自定义Attribute类:VersionAttribute [Attribu ...
- C#中的Attribute和Java中的Annotation
在之前的博客中介绍过C#的Attribute(特性),简单的说,特性主要就是利用反射技术,在运行期获取关注类的相关标注信息,然后利用这些标注信息对关注的类进行处理,最近因为工作的原因,需要看一下Jav ...
随机推荐
- 再谈对协变和逆变的理解(Updated)
去年写过一篇博客谈了下我自己对协变和逆变的理解,现在回头看发现当时还是太过“肤浅”,根本没理解.不久前还写过一篇“黑”Java泛型的博客,猛一回头又是“肤浅”,今天学习Java泛型的时候又看到了协变和 ...
- XSS的DOS攻击之 server limit dos
墨西哥同学周末很郁闷的在宾馆上网,发现youtube被ban了,于是写个了tool解决这个问题.顺带想到了一种利用 google 统计的漏洞,写在这里了 http://sirdarckcat.blog ...
- Windows程序----初识Windows程序
先来看一些励志名言来激励一下自己吧! 励志名言:每一发奋发奋的背后,必有加倍的赏赐 1.有无目标是成功者与平庸者的根本差别. 2.成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成. 3.当 ...
- Java中Properties类的操作
知识学而不用,就等于没用,到真正用到的时候还得重新再学.最近在看几款开源模拟器的源码,里面涉及到了很多关于Properties类的引用,由于Java已经好久没用了,而这些模拟器大多用Java来写,外加 ...
- Ubuntu 16.04 下安装Firefox的Flash插件
在ubuntu系统环境下面打开优酷视频,发现无法播放视频.Adobe Flash Player 是一款轻量级浏览器插件,具有丰富的 Internet 应用运行时间,提供持续的迷人用户体验.绝妙的音频/ ...
- rubycas-client单点登录
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) 进行中,未完待续 Ruby 客户端 使用方法0. 在 Gemfile中,加入: gem 'rubyc ...
- [BZOJ3670][UOJ#5][NOI2014]动物园
[BZOJ3670][UOJ#5][NOI2014]动物园 试题描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学 ...
- HDU3466背包01
Proud Merchants Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) ...
- 【SpringMVC】SpringMVC系列7之POJO 对象绑定请求参数值
7.POJO 对象绑定请求参数值 7.1.概述 Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值.而且支持级联属性.如:dept.deptId.dept ...
- catalog、scheme区别
按照SQL标准的解释,在SQL环境下Catalog和Schema都属于抽象概念,可以把它们理解为一个容器或者数据库对象命名空间中的一个层次,主要用来解决命名冲突问题.从概念上说,一个数据库系统包含多个 ...