AttributeUsage属性

 除了定制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标志是false,则该属性将忽略继承属性。若继承标志和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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值