除了定制attributes之外,可以使用Attributes属性定义如何使用这些属性。例如:
[AttributeUsage(
validon,
AllowMultiple = allowmultiple,
Inherited = inherited
)]
强烈推荐使用AttributeUsage属性将属性文档化,因此属性的用户能直接使用已命名的属性,而不用在源代码中查找公用的读/写字段和属性。
定义属性目标
1
public
enum AttributeTargets
2
{
3
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Assembly = 0x0001,
4
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Module = 0x0002,
5
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Class = 0x0004,
6
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Struct = 0x0008,
7
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Enum = 0x0010,
8
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Constructor = 0x0020,
9
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Method = 0x0040,
10
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Property = 0x0080,
11
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Field = 0x0100,
12
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Event = 0x0200,
13
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Interface = 0x0400,
14
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Parameter = 0x0800,
15
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Delegate = 0x1000,
16
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
All = Assembly │ Module │ Class │ Struct │ Enum │ Constructor │
17
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Method │ Property │ Field │ Event │ Interface │ Parameter │
18
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Delegate,
19
20
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ClassMembers = Class │ Struct │ Enum │ Constructor │ Method │
21
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Property │ Field │ Event │ Delegate │ Interface,
22
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
23
当使用Attribute属性时,能指定AttributeTargets.all(属性目标),因此属性能被附加到在枚举AttributeTargets列出的任意类型上。若未指定AttributeUsage属性,缺省值是AttributeTargets.All。属性AttributeTargets用来限制属性使用范围。
可以使用或(|)操作符组合属性目标枚举中列出的项。
单一用途和多用途属性
可以使用AttributeUsage定义属性的单一用途或多用途。即确定在单个字段上使用单一属性的次数。在缺省情况下,所有属性都是单用途的。在AttributeUsage属性中,指定AllowMultiple为true,则允许属性多次附加到指定的类型上。例如:
1
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
[AttributeUsage(AttributeTargets.All, AllowMultiple=
true)]
2
public
class SomethingAttribute : Attribute
3
{
4
public SomethingAttribute(String str)
5
{
6
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
7
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
8
9
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
[Something("abc")]
10
![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
[Something("def")]
11
class MyClass
12
{
13
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
14
指定继承属性规则
在AttributeUsageAttribute属性的最后部分是继承标志,用于指定属性是否能被继承。缺省值是false。然而,若继承标志被设置为true,它的含义将依赖于AllowMultiple标志的值。若继承标志被设置为true,并且AllowMultiple标志是false,则该属性将忽略继承属性。若继承标志和AllowMultiple标志都被设置为true,则该属性的成员将与派生属性的成员合并。范例:
1
using System;
2
using System.Reflection;
3
4
namespace AttribInheritance
5
{
6
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[AttributeUsage(
7
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
AttributeTargets.All,
8
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
AllowMultiple =
true,
9
//
AllowMultiple = false,
10
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Inherited =
true
11
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
)]
12
public
class SomethingAttribute : Attribute
13
{
14
private
string name;
15
public
string Name
16
{
17
get
{
return name; }
18
set
{ name = value; }
19
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
20
21
public SomethingAttribute(
string str)
22
{
23
this.name = str;
24
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
25
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
26
27
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[Something("abc")]
28
class MyClass
29
{
30
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
31
32
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[Something("def")]
33
class Another : MyClass
34
{
35
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
36
37
class Test
38
{
39
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
[STAThread]
40
static
void Main(
string[] args)
41
{
42
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Type type =
43
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Type.GetType("AttribInheritance.Another");
44
foreach (Attribute attr
in type.GetCustomAttributes(
true))
45
//
type.GetCustomAttributes(false))
46
{
47
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
SomethingAttribute sa =
48
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
attr
as SomethingAttribute;
49
if (
null != sa)
50
{
51
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.WriteLine(
52
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
"Custom Attribute: {0}",
53
![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
sa.Name);
54
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
55
![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
56
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
若AllowMultiple设置为false,结果是:
Custom Attribute: def
若AllowMultiple设置为true,结果是:
Custom Attribute: def
Custom Attribute: abc