C Sharp

Single-Use and Multiuse Attributes

You can use AttributeUsage to define attributes as either single-use or multiuse. This decision pertains to how many times a single attribute can be used on a single field. By default, all attributes are single-use, meaning that compiling the following results in a compiler error: -

using System;
using System.Reflection;
public class SingleUseAttribute : Attribute
{
    public SingleUseAttribute(String str)
    {
    }
}
// ERROR: This results in a "duplicate attribute" compiler error.
[SingleUse("abc")]
[SingleUse("def")]
class MyClass
{
}
class SingleUseApp
{
    public static void Main()
    {
    }
}

To fix this problem, specify on the AttributeUsage line that you want to allow the attribute to be attached multiple times to a given type. This would work: -

using System;
using System.Reflection;
[AttributeUsage(AttributeTargets.All, AllowMultiple=true)]
public class SingleUseAttribute : Attribute
{
    public SingleUseAttribute(String str)
    {
    }
}
[SingleUse("abc")]
[SingleUse("def")]
class MyClass
{
}
class MultiUseApp
{
    public static void Main()
    {
    }
}

A practical example of where you might want to use this approach is with the RegistryKeyAttribute attribute discussed in "Defining Attributes." Because it's conceivable that a field might be saved in multiple places in the Registry, you would attach the AttributeUsage attribute with the AllowMultiple named parameter as in the code here.