AttributeUsage属性
除了定制attributes之外,可以使用Attributes属性定义如何使用这些属性。例如:
[AttributeUsage(
validon,
AllowMultiple = allowmultiple,
Inherited = inherited
)]
强烈推荐使用AttributeUsage属性将属性文档化,因此属性的用户能直接使用已命名的属性,而不用在源代码中查找公用的读/写字段和属性。
定义属性目标
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}
当使用Attribute属性时,能指定AttributeTargets.all(属性目标),因此属性能被附加到在枚举AttributeTargets列出的任意类型上。若未指定AttributeUsage属性,缺省值是AttributeTargets.All。属性AttributeTargets用来限制属性使用范围。
[AttributeUsage(AttributeTargets.Class)] 2public class RemoteObjectAttribute : Attribute 3{ 4… 5} 6 7[AttributeUsage(AttributeTargets.Method)] 8public class TransactionableAttribute : Attribute 9{ 10 11 12 13}
可以使用或(|)操作符组合属性目标枚举中列出的项。
单一用途和多用途属性
可以使用AttributeUsage定义属性的单一用途或多用途。即确定在单个字段上使用单一属性的次数。在缺省情况下,所有属性都是单用途的。在AttributeUsage属性中,指定AllowMultiple为true,则允许属性多次附加到指定的类型上。例如:
[AttributeUsage(AttributeTargets.All, AllowMultiple=true)] 2public class SomethingAttribute : Attribute 3{ 4 public SomethingAttribute(String str) 5 { 6 } 7} 8 9[Something("abc")] 10[Something("def")] 11class MyClass 12{ 13}
指定继承属性规则
在AttributeUsageAttribute属性的最后部分是继承标志,用于指定属性是否能被继承。缺省值是false。然而,若继承标志被设置为true,它的含义将依赖于AllowMultiple标志的值。若继承标志被设置为true,并且AllowMultiple标志是flag,则改属性将忽略继承属性。若继承标志和AllowMultiple标志都被设置为true,则改属性的成员将与派生属性的成员合并。范例:
using System; 2using System.Reflection; 3 4namespace 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}
若AllowMultiple设置为false,结果是:
Custom Attribute: def
若AllowMultiple设置为true,结果是:
Custom Attribute: def
Custom Attribute: abc