Как создать дубликаты разрешенных атрибутов

Я использую настраиваемый атрибут, унаследованный от класса атрибута. Я использую его следующим образом:

    [MyCustomAttribute("CONTROL")]
    [MyCustomAttribute("ALT")]
    [MyCustomAttribute("SHIFT")]
    [MyCustomAttribute("D")]
    public void setColor()
{

}

Но отображается ошибка "Duplicate" MyCustomAttribute "атрибут".
Как создать дублированный разрешенный атрибут?

Ответ 1

Прикрепите атрибут AttributeUsage к вашему классу атрибутов (yep, that mouthful) и установите AllowMultiple в true:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public sealed class MyCustomAttribute: Attribute

Ответ 2

AttributeUsageAttribute;-p

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyAttribute : Attribute
{}

Обратите внимание, что если вы используете ComponentModel (TypeDescriptor), он поддерживает только один экземпляр атрибута (по типу атрибута) для каждого члена; необработанное отражение поддерживает любое число...

Ответ 3

Решение Антона корректно, но есть еще одна версия.

Короче говоря, если ваш пользовательский attrbiute не отменяет TypeId, то доступ к нему через PropertyDescriptor.GetCustomAttributes() будет возвращать только один экземпляр вашего атрибута.

Ответ 4

В качестве альтернативы подумайте о перепроектировании вашего атрибута, чтобы разрешить последовательность.

[MyCustomAttribute(Sequence="CONTROL,ALT,SHIFT,D")]

или

[MyCustomAttribute("CONTROL-ALT-SHIFT-D")]

затем проанализируйте значения, чтобы настроить свой атрибут.

Для примера ознакомьтесь с авторизованным атрибутом в исходном коде ASP.NET MVC на www.codeplex.com/aspnet.

Ответ 5

По умолчанию Attribute ограничивается тем, что применяется только один раз к одному полю/свойству/etc. Это можно увидеть из определения класса Attribute в MSDN:

[AttributeUsageAttribute(..., AllowMultiple = false)]
public abstract class Attribute : _Attribute

Поэтому, как отмечали другие, все подклассы ограничены таким же образом, и если вам потребуется несколько экземпляров одного и того же атрибута, вам нужно явно установить AllowMultiple в true:

[AttributeUsage(..., AllowMultiple = true)]
public class MyCustomAttribute : Attribute

В атрибутах, допускающих множественное использование, вы также должны переопределить свойство TypeId, чтобы гарантировать, что такие свойства, как PropertyDescriptor.Attributes работает должным образом. Самый простой способ сделать это - реализовать это свойство для возврата самого экземпляра атрибута:

[AttributeUsage(..., AllowMultiple = true)]
public class MyCustomAttribute : Attribute
{
    public override object TypeId
    {
        get
        {
            return this;
        }
    }
}

(Проводя этот ответ не потому, что другие ошибаются, а потому, что это более полный/канонический ответ.)

Ответ 6

После добавления AttributeUsage убедитесь, что вы добавили это свойство в свой класс Attribute

public override object TypeId
{
  get
  {
    return this;
  }
}