除了定制attributes之外,可以使用Attributes属性定义如何使用这些属性。例如:
[AttributeUsage(
validon,
AllowMultiple = allowmultiple,
Inherited = inherited
)]
强烈推荐使用AttributeUsage属性将属性文档化,因此属性的用户能直接使用已命名的属性,而不用在源代码中查找公用的读/写字段和属性。
定义属性目标
1

public enum AttributeTargets
2



{
3

Assembly = 0x0001,
4

Module = 0x0002,
5

Class = 0x0004,
6

Struct = 0x0008,
7

Enum = 0x0010,
8

Constructor = 0x0020,
9

Method = 0x0040,
10

Property = 0x0080,
11

Field = 0x0100,
12

Event = 0x0200,
13

Interface = 0x0400,
14

Parameter = 0x0800,
15

Delegate = 0x1000,
16

All = Assembly │ Module │ Class │ Struct │ Enum │ Constructor │
17

Method │ Property │ Field │ Event │ Interface │ Parameter │
18

Delegate,
19

20

ClassMembers = Class │ Struct │ Enum │ Constructor │ Method │
21

Property │ Field │ Event │ Delegate │ Interface,
22

}
23

当使用Attribute属性时,能指定AttributeTargets.all(属性目标),因此属性能被附加到在枚举AttributeTargets列出的任意类型上。若未指定AttributeUsage属性,缺省值是AttributeTargets.All。属性AttributeTargets用来限制属性使用范围。
1

[AttributeUsage(AttributeTargets.Class)]
2

public class RemoteObjectAttribute : Attribute
3



{
4

…
5

}
6

7

[AttributeUsage(AttributeTargets.Method)]
8

public class TransactionableAttribute : Attribute
9



{
10

11

12

13

}
14

可以使用或(|)操作符组合属性目标枚举中列出的项。
单一用途和多用途属性
可以使用AttributeUsage定义属性的单一用途或多用途。即确定在单个字段上使用单一属性的次数。在缺省情况下,所有属性都是单用途的。在AttributeUsage属性中,指定AllowMultiple为true,则允许属性多次附加到指定的类型上。例如:
1

[AttributeUsage(AttributeTargets.All, AllowMultiple=true)]
2

public class SomethingAttribute : Attribute
3



{
4

public SomethingAttribute(String str)
5


{
6

}
7

}
8

9

[Something("abc")]
10

[Something("def")]
11

class MyClass
12



{
13

}
14

指定继承属性规则
在AttributeUsageAttribute属性的最后部分是继承标志,用于指定属性是否能被继承。缺省值是false。然而,若继承标志被设置为true,它的含义将依赖于AllowMultiple标志的值。若继承标志被设置为true,并且AllowMultiple标志是flag,则改属性将忽略继承属性。若继承标志和AllowMultiple标志都被设置为true,则改属性的成员将与派生属性的成员合并。范例:
1

using System;
2

using System.Reflection;
3

4

namespace AttribInheritance
5



{
6

[AttributeUsage(
7

AttributeTargets.All,
8

AllowMultiple = true,
9

//AllowMultiple = false,
10

Inherited = true
11

)]
12

public class SomethingAttribute : Attribute
13


{
14

private string name;
15

public string Name
16


{
17


get

{ return name; }
18


set

{ name = value; }
19

}
20

21

public SomethingAttribute(string str)
22


{
23

this.name = str;
24

}
25

}
26

27

[Something("abc")]
28

class MyClass
29


{
30

}
31

32

[Something("def")]
33

class Another : MyClass
34


{
35

}
36

37

class Test
38


{
39

[STAThread]
40

static void Main(string[] args)
41


{
42

Type type =
43

Type.GetType("AttribInheritance.Another");
44

foreach (Attribute attr in type.GetCustomAttributes(true))
45

//type.GetCustomAttributes(false))
46


{
47

SomethingAttribute sa =
48

attr as SomethingAttribute;
49

if (null != sa)
50


{
51

Console.WriteLine(
52

"Custom Attribute: {0}",
53

sa.Name);
54

}
55

}
56

57

}
58

}
59

}
60

若AllowMultiple设置为false,结果是:
Custom Attribute: def
若AllowMultiple设置为true,结果是:
Custom Attribute: def
Custom Attribute: abc