AttributeUsage属性
除了用于标注常规c#类型的自定义属性以外,还可以使用AttributeUsage属性定义你使用这些属性的方式.文档记录的AttributeUsage属性调用惯例如下:
[AttributeUsage(
validon,
AllowMultiple=allowmultiple,
Inherited=inherited
)]
如你所见,识别位置参数和命名过的参数是很容易的.我们强烈建议你以这种方式对属性进行文档记录,这样,属性的用户不必从头到尾查看属性类的源代码,并且可以找到作为命名过的参数使用的公共读/写字段和特性.
定义属性目标
再看看AttributeUsage属性,请注意validon参数是一个位置参数,因此是必须的.这个参数用于指定属性可以附着于哪些类型.实际上,AttributeUsage属性中的validon参数是AttributeTagets类型的,这个枚举值的定义如下:
public enum AttributeTargets
{
Assembly=0x0001,
Module=0x0002,
Class=0x0004,
Struct=0x0008,
Enum=0x0010,
Constructor=0x0020,
Method=0x0040,
Property=0x0080,
Field=0x0100,
Event=0x0200,
Interface=0x0400,
Parameter=0x0800,
Delegate=0x1000,
All=Assembly|Module|Class|Struct|Enum|Constructor|
Method|Property|Field|Event|Interface|Paramter|
Delegate,
ClassMembers=Class|Struct|Enum|Constructor|Method|Property|Field|Event|Delegate|Interface,
}
在使用AttributeUsage属性时可以指定AttributeTargets.All,这样属性就可以附着于AttributeTargets枚举中列出的任何类型.
何时以及为什么指定validon(AttributeTargets)参数?如果你希望精确地控制一个属性的用法,就需要使用validon参数.
单次使用和多次使用的属性
可以使用AttributeUsage将属性定义为单次使用或多次使用.这个决定决定了可以在单个字段上使用某个属性多少次.在默认情况下,所有属性都是单次使用的,所以编译以下代码会导致一个编译器错误;
public class SomethingAttribute:Attribute
{
public SomethingAttribute(string str)
{}
}