C#一个元素是否可以重复声明同一个特性?

对于有些业务逻辑来说,一个特性反复地申明在同一个元素上市没有必要的,但同时对于另一些逻辑来说,又非常有必要对同一元素多次申明同一特性。很幸运,.NET的特性机制完美支持了这一类业务需求。.

当一个特性申明了AttributeUsage特性并且显式地将AllowMultiple属性设置为true时,该特性就可以在同一元素上多次申明,否则的话编译器将报错

例如下面一段代码,类型Program多次申明了MyCustomAttribute特性:

[MyCustom("Class1")]
[MyCustom("Class2")]
[MyCustom("Class3")]
public class Program
{
    public static void Main(string[] args)
    {
    }
}

/// <summary>
/// 一个自定义特性MyCustomAttribute
/// </summary>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class MyCustomAttribute : Attribute
{
    private string className;

    public MyCustomAttribute(string className)
    {
        this.className = className;
    }

    // 一个只读属性ClassName
    public string ClassName
    {
        get
        {
            return className;
        }
    }
}

通常情况下,重复申明同一特性往往会传入不同的参数。

此外,如果不显式地设置AllowMultiple属性时多次申明同一特性会如何呢?

在这种情况下,编译器将会认为自定义特性不能多次申明在同一元素上,会出现以下的编译错误:

C#一个元素是否可以重复声明同一个特性?