https://www.cnblogs.com/ldyblogs/p/attribute.html 例子
https://www.cnblogs.com/luckdv/articles/Atrribute.html
http://www.runoob.com/csharp/csharp-attribute.html

1、什么是Atrribute
首先,我们肯定Attribute是一个类,下面是msdn文档对它的描述:
公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。

在.NET中,Attribute被用来处理多种问题,比如序列化、程序的安全特征、防止即时编译器对程序代码进行优化从而代码容易调试等等。下面,我们先来看几个在.NET中标准的属性的使用,稍后我们再回过头来讨论Attribute这个类本身。(文中的代码使用C#编写,但同样适用所有基于.NET的所有语言)

3、Attribute类
除了.NET提供的那些Attribute派生类之外,我们可以自定义我们自己的Attribute,所有自定义的Attribute必须从Attribute类派生。现在我们来看一下Attribute 类的细节:

protected Attribute(): 保护的构造器,只能被Attribute的派生类调用。

三个静态方法:

static Attribute GetCustomAttribute():这个方法有8种重载的版本,它被用来取出施加在类成员上指定类型的Attribute。

static Attribute[] GetCustomAttributes(): 这个方法有16种重载版本,用来取出施加在类成员上指定类型的Attribute数组。

static bool IsDefined():由八种重载版本,看是否指定类型的定制attribute被施加到类的成员上面。

实例方法:

bool IsDefaultAttribute(): 如果Attribute的值是默认的值,那么返回true。

bool Match():表明这个Attribute实例是否等于一个指定的对象。

公共属性: TypeId: 得到一个唯一的标识,这个标识被用来区分同一个Attribute的不同实例。

我们简单地介绍了Attribute类的方法和属性,还有一些是从object继承来的。这里就不列出来了。

下面介绍如何自定义一个Attribute: 自定义一个Attribute并不需要特别的知识,其实就和编写一个类差不多。自定义的Attribute必须直接或者间接地从Attribute这个类派生,如:

public MyCustomAttribute : Attribute { … }

这里需要指出的是Attribute的命名规范也就是你的Attribute的类名+“Attribute”,当你的Attribute施加到一个程序的元素上的时候,编译器先查找你的Attribute的定义,如果没有找到,那么它就会查找“Attribute名称"+Attribute的定义。如果都没有找到,那么编译器就报错。

4、定义或控制特性的使用

对于一个自定义的Attribute,你可以通过AttributeUsage的Attribute来限定你的Attribute 所施加的元素的类型。代码形式如下:
[AttributeUsage(参数设置)] public 自定义Attribute : Attribute { … }

作为参数的AttributeTargets的值允许通过“或”操作来进行多个值得组合,如果你没有指定参数,那么默认参数就是All 。 AttributeUsage除了继承Attribute 的方法和属性之外,还定义了以下三个属性:

AllowMultiple: 读取或者设置这个属性,表示是否可以对一个程序元素施加多个Attribute 。

Inherited:读取或者设置这个属性,表示是否施加的Attribute 可以被派生类继承或者重载。

ValidOn: 读取或者设置这个属性,指明Attribute 可以被施加的元素的类型。

下面让我们来做一些实际的东西。我们将会在Help特性前放置AttributeUsage特性以期待在它的帮助下控制Help特性的使用。
这是一段程序代码。

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public class HelpAttribute : Attribute
{public HelpAttribute(String Description_in){this.description = Description_in;}protected String description;public String Description{get{return this.description;}}
}

代码讨论
属性 AttributeUsage 指定该属性可以应用于的语言元素。
属性类是从 System.Attribute 派生的公共类,至少有一个公共构造函数。
属性类有两种类型的参数:
“定位参数”,每次使用属性时都必须指定这些参数。定位参数被指定为属性类的构造函数参数。在上面的示例中,url 便是一个定位参数。
“命名参数”,可选。如果使用属性时指定了命名参数,则必须使用参数的名称。通过包含非静态字段或属性来定义命名参数。在上面的示例中,Topic 便是一个命名参数。

先让我们来看一下AttributeTargets.Class**。它规定了Help特性只能被放在class的前面**。这也就意味着下面的代码将会产生错误:
这是一段程序代码。

[Help("this is a do-nothing class")]
public class AnyClass
{[Help("this is a do-nothing method")] //error public void AnyMethod(){}
}

编译器报告错误如下:

AnyClass.cs: Attribute ‘Help’ is not valid on this declaration type.

It is valid on ‘class’ declarations only.

我们可以使用AttributeTargets.All来允许Help特性被放置在任何程序实体前。可能的值是:

Assembly,Module,Class,Struct,Enum,Constructor,Method,Property,Field,Event,Interface,
Parameter,Delegate。

All = Assembly | Module | Class | Struct | Enum | Constructor | Method | Property | Field | Event | Interface | Parameter | Delegate,

ClassMembers = Class | Struct | Enum | Constructor | Method | Property | Field | Event | Delegate | Interface )

下面考虑一下AllowMultiple = false。它规定了特性不能被重复放置多次。

这是一段程序代码。

[Help("this is a do-nothing class")]
[Help("it contains a do-nothing method")]
public class AnyClass
{[Help("this is a do-nothing method")] //error public void AnyMethod(){}
}

它产生了一个编译期错误。

AnyClass.cs: Duplicate ‘Help’ attribute

Ok,现在我们来讨论一下最后的这个属性。Inherited, 表明当特性被放置在一个基类上时,它能否被派生类所继承。
这是一段程序代码。

[Help("BaseClass")]
public class Base
{
}
public class Derive : Base
{
}

这里会有四种可能的组合:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false ]

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false ]

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true ]

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true ]

第一种情况:

如果我们查询(Query)(稍后我们会看到如何在运行期查询一个类的特性)Derive类,我们将会发现Help特性并不存在,因为inherited属性被设置为false。

第二种情况:

和第一种情况相同,因为inherited也被设置为false。

第三种情况:

为了解释第三种和第四种情况,我们先来给派生类添加点代码:

这是一段程序代码。

[Help("BaseClass")]
public class Base
{
}
[Help("DeriveClass")]
public class Derive : Base
{
}

现在我们来查询一下Help特性,我们只能得到派生类的属性,因为inherited被设置为true,但是AllowMultiple却被设置为false。因此基类的Help特性被派生类Help特性覆盖了。

第四种情况:

在这里,我们将会发现派生类既有基类的Help特性,也有自己的Help特性,因为AllowMultiple被设置为true。

通过反射访问属性
**属性与程序元素关联后,可以使用反射查询属性存在及其值。查询属性的主要反射方法包含在 System.Reflection.MemberInfo 类(GetCustomAttributes 方法族)中。**下面的示例演示使用反射获取对属性的访问的基本方法:
这是一段程序代码。

System.Reflection.MemberInfo info = typeof(Help);
object[] attributes = info.GetCustomAttributes(true);
for (int i = 0; i < attributes.Length; i++)
{System.Console.WriteLine(attributes[i]);
}

Attribute 属性相关推荐

  1. C#里Attribute属性

    系统内置属性 系统内置的Attribute属性Obsolete,被个这属性标记的方法在别的地方被调用的时候会有警告提示; 这个属性还可以指定第二个布尔参数,设置编译时是否报错; 例: 1 [Obsol ...

  2. attribute属性

    attribute属性 __attribute__介绍 attribute的格式. __attribute__((attribute-list)) attribute属性可以在编译的时候告诉编译器函数 ...

  3. java attribute属性_[Java教程]JS Attribute属性操作

    [Java教程]JS Attribute属性操作 0 2016-05-19 00:00:05 Attribute是属性的意思,文章仅对部分兼容IE和FF的Attribute相关的介绍. attribu ...

  4. [Wordpress]wp_dropdown_categories() 添加自定义的attribute(属性)

    通过Wordpress wp_dropdown_categories()可以获取到Wordpress中的分类列表,假如需要添加一些Html5属性,如required,在看了这个方法的文档说明,没有参数 ...

  5. 通过声明Attribute属性改变不同类的输出效果

    ConsoleApplication--控制台应用程序 首先创建基类: using System; using System.Collections.Generic; using System.Lin ...

  6. 三类常见软件质量(Quality Attribute)属性的通俗解释

    外部质量 用户关心 正确性,最最基本的质量属性,对应功能需求,其他QA多对应非功能需求. 健壮性,在异常情况下正常运行的能力. 包含容错能力和恢复能力.恢复没有容错健壮. 可靠性,用平均无bug运行时 ...

  7. VHDL 属性语句之attribute 和keep

    attribute属性: 定义格式: attribute 属性名 :数据类型: attribute 属性名 of 对象名 : 对象类型 is 值: 引脚锁定的设置也能够直接写在程序文件中.这就是liy ...

  8. 计算机语言属性的定义,Attribute

    Attribute (计算机语言) 语音 编辑 锁定 讨论 上传视频 元素用于向元素添加属性. 注释: 元素会替换名称相同的已有属性. 中文名 Attribute 注    释 元素会替换名称相同的已 ...

  9. XMLDOM对象方法:对象属性

    轉自:http://www.cnbruce.com/blog/showlog.asp?cat_id=34&log_id=1085 async 属性 作 用 async 属性表示是否允许异步的下 ...

最新文章

  1. golang 打印调用堆栈
  2. git push 代码报错 Pushing to Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
  3. C#中ComboBox动态绑定赋值
  4. 带有Angular JS的Java EE 7 –第1部分
  5. 计算机课件知识,计算机基础知识1认识计算机课件.ppt
  6. python3读取本地_Python3 获取本机 IP
  7. snmp连接工具_2020好用的综合性网络监控工具
  8. Anaconda下载安装
  9. java使用itext导出pdf,图片、表格、背景图
  10. 中国企业家:TD-SCDMA的坎坷商业路
  11. 如何处理pagefile.sys占用太多C盘空间
  12. HUAWEI 机试题:按区间反转文章片段
  13. C/C++ 正则表达式 regex库介绍(详细版)
  14. 计算机win10分区软件,简单易用的win10分区软件:分区助手
  15. Linux meld安装
  16. 内部基因决定拼购品质,苏宁拼购或将成为行业发展新标杆
  17. 全栈的好处:七天和两周
  18. 浅谈产业界与学术界的合作研究
  19. 基于javaweb+springboot的医院管理系统(java+Springboot+ssm+mysql+maven)
  20. java web论文_(定稿)毕业论文基于JavaWeb技术博客项目的设计论文(完整版)最新版...

热门文章

  1. 8月AI论文GitHub十强榜出炉!语言-图像模型连斩Top2
  2. 2021-04-01 Oracle 创建触发器 违反唯一约束条件
  3. $router和$route
  4. 【spring系列】spring依赖注入实现方式(含案例)
  5. 林期苏曼属性标签编辑_标签打印软件如何打印一式两联标签
  6. 让世界真实起来·字符型点阵液晶显示屏
  7. 如何计算用户在某个车站上下车,地图匹配方法
  8. android9启动器,CircleLauncher-环形启动器 安卓版v9.0.9-PC6安卓网
  9. 2020年登高架设找答案及登高架设考试试卷
  10. 六性分析报告包括什么,及简要模板