本文整理自网络。
首先你得理解什么是Attribute(这里翻译为特性,属性应该对应于(Property),是c#另一个内容了),特性允许我们添加类似关键字(比如public)的批注来为元素(可以是class,method,property,parameter,event等),在运行时可以通过反射获得这些信息,从而影响程序的行为。
对于Attribute,我们可以使用AttributesUage施加在这些特性(attribute)之上。我们姑且可以称AttributeUsage为元特性(专门施加在特性之上的特性)
[AttributeUsage( validon, AllowMultiple = allowmultiple, Inherited = inherited)]
例如:[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]//注意后面两个参数必须以具名参数的方式给出,不能直接写true,false。
下面分别讲解这三个参数:
一、validon
定义特性目标
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
23
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
当使用Attribute特性时,我们有时需要指定这些特性施加的目标类型AttributeTargets。我们给定AttributeTargets.Class,因此特性只能被附加到类类型上。若未指定AttributeUsage特性,缺省值是AttributeTargets.All。特性AttributeTargets用来限制特性使用范围。
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
6
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
10
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
14
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
可以使用或(|)操作符组合特性目标枚举中列出的项。
单一用途和多用途特性
可以使用AttributeUsage定义特性的单一用途或多用途,即确定在某个类型上使用某一特性的次数。在缺省情况下,所有特性都是单用途的。在AttributeUsage特性中,指定AllowMultiple为true,则允许特性多次附加到指定的类型上。例如:
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
6
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
7
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
8
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9 [Something("abc")]
10
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
13
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
14
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
指定继承特性规则
在AttributeUsageAttribute特性的最后部分是继承标志,指示父类的某个特性是否能被子类继承。缺省值是false。当该参数为FALSE时,一切都很容易理解。然而,若继承标志被设置为true,它的含义将依赖于AllowMultiple标志的值。(原文这里讲的并不清楚)
若继承标志被设置为true,AllowMultiple标志是false,则子类该类型特性将覆盖父类该类型特性。
若继承标志被设置为true,AllowMultiple标志是true,则父类该特性的成员与子类同类型特性的成员同时存在于子类。
范例:
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
6
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
14
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
17
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
18
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
19
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
20
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
23
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
25
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
26
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
28
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
30
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
31
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
32
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
33
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
34
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
35
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
36
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
38
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
39
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
40
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
41
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
42
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
44
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
46
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
47
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
49
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
50
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
51
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
54
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
55
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
56
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
57
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
58
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
59
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
60
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
若AllowMultiple设置为false,结果是:
Another
若AllowMultiple设置为true,结果是:
MyClass
Another
原文地址:
http://www.cnblogs.com/stzyw/archive/2005/10/07/249693.html
参考文献:
《C# 4.0权威指南》
http://bbs.csdn.net/topics/360111279