AttributeUsage属性
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AttributeUsage属性
除了定制attributes之外,可以使用Attributes属性定义如何使用这些属性。例如:[AttributeUsage( validon,
AllowMultiple = allowmultiple,
Inherited = inherited
)]
强烈推荐使用AttributeUsage属性将属性文档化,因此属性的用户能直接使用已命名的属性,而不用在源代码中查找公用的读/写字段和属性。
定义属性目标
1public enum AttributeTargets
2{
3Assembly = 0x0001,
4Module = 0x0002,
5Class = 0x0004,
6Struct = 0x0008,
7Enum = 0x0010,
8Constructor = 0x0020,
9Method = 0x0040,
10Property = 0x0080,
11Field = 0x0100,
12Event = 0x0200,
13Interface = 0x0400,
14Parameter = 0x0800,
15Delegate = 0x1000,
16All = Assembly │ Module │ Class │ Struct │ Enum │ Constructor │
17Method │ Property │ Field │ Event │ Interface │ Parameter │
18Delegate,
19
20ClassMembers = Class │ Struct │ Enum │ Constructor │ Method │
21Property │ Field │ Event │ Delegate │ Interface,
22}
23
当使用Attribute属性时,能指定AttributeTargets.all(属性目标),因此属性能被附加到在枚举Attribute Targets列出的任意类型上。若未指定AttributeUsage属性,缺省值是AttributeTargets.All。属性Attribut eTargets用来限制属性使用范围。
1[AttributeUsage(AttributeTargets.Class)]
2public class RemoteObjectAttribute : Attribute
3{
4…
5}
6
7[AttributeUsage(AttributeTargets.Method)]
8public class TransactionableAttribute : Attribute
9{
10
11
12
13}
14
可以使用或(|)操作符组合属性目标枚举中列出的项。单一用途和多用途属性
可以使用AttributeUsage定义属性的单一用途或多用途。即确定在单个字段上使用单一属性的次数。在缺省情况下,所有属性都是单用途的。在AttributeUsage属性中,指定AllowMultiple 为true,则允许属性多次附加到指定的类型上。例如:
1[AttributeUsage(AttributeTargets.All, AllowMultiple=true)]
2public class SomethingAttribute : Attribute
3{
4public SomethingAttribute(String str)
5{
6}
7}
8
9[Something("abc")]
10[Something("def")]
11class MyClass
12{
13}
14
指定继承属性规则
在AttributeUsageAttribute属性的最后部分是继承标志,用于指定属性是否能被继承。缺省值是false。然而,若继承标志被设置为true,它的含义将依赖于AllowMultiple标志的值。若继承标志被设置为true,并且AllowMultiple标志是flag,则改属性将忽略继承属性。若继承标志和AllowMultiple标志都被设置为true,则改属性的成员将与派生属性的成员合并。范例:
1using System;
2using System.Reflection;
3
4namespace AttribInheritance
5{
6[AttributeUsage(
7AttributeTargets.All,
8AllowMultiple = true,
9//AllowMultiple = false,
10Inherited = true
11)]
12public class SomethingAttribute : Attribute 13{
14private string name;
15public string Name
16{
17get{ return name; }
18set{ name = value; }
19}
20
21public SomethingAttribute(string str)
22{
= str;
24}
25}
26
27[Something("abc")]
28class MyClass
29{
30}
31
32[Something("def")]
33class Another : MyClass
34{
35}
36
37class Test
38{