How to create duplicate allowed attributes
By default, Attribute
s are limited to being applied only once to a single field/property/etc. You can see this from the definition of the Attribute
class on MSDN:
[AttributeUsageAttribute(..., AllowMultiple = false)]
public abstract class Attribute : _Attribute
Therefore, as others have noted, all subclasses are limited in the same way, and should you require multiple instances of the same attribute, you need to explicitly set AllowMultiple
to true
:
[AttributeUsage(..., AllowMultiple = true)]
public class MyCustomAttribute : Attribute
On attributes that allow multiple usages, you should also override the TypeId
property to ensure that properties such as PropertyDescriptor.Attributes
work as expected. The easiest way to do this is to implement that property to return the attribute instance itself:
[AttributeUsage(..., AllowMultiple = true)]
public class MyCustomAttribute : Attribute
{
public override object TypeId
{
get
{
return this;
}
}
}
(Posting this answer not because the others are wrong, but because this is a more comprehensive/canonical answer.)
Anton's solution is correct, but there is another gotcha.
In short, unless your custom attribute overrides TypeId, then accessing it through PropertyDescriptor.GetCustomAttributes()
will only return a single instance of your attribute.
Stick an AttributeUsage
attribute onto your Attribute class (yep, that's mouthful) and set AllowMultiple
to true
:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public sealed class MyCustomAttribute: Attribute
AttributeUsageAttribute ;-p
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyAttribute : Attribute
{}
Note, however, that if you are using ComponentModel (TypeDescriptor
), it only supports one attribute instance (per attribute type) per member; raw reflection supports any number...