Как создать дубликаты разрешенных атрибутов - PullRequest
86 голосов
/ 16 февраля 2009

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

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

}

Но отображается ошибка «Дублировать атрибут MyCustomAttribute».
Как я могу создать дубликат разрешенного атрибута?

Ответы [ 6 ]

166 голосов
/ 16 февраля 2009

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

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public sealed class MyCustomAttribute: Attribute
19 голосов
/ 16 февраля 2009

AttributeUsageAttribute; -p

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

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

12 голосов
/ 02 сентября 2009

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

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

6 голосов
/ 03 марта 2017

По умолчанию Attribute s ограничены применением только один раз к одному полю / свойству / и т. Д. Это можно увидеть из определения класса 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;
        }
    }
}

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

3 голосов
/ 16 февраля 2009

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

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

или

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

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

В качестве примера этого проверьте исходный код AuthorizeAttribute в ASP.NET MVC по адресу www.codeplex.com / aspnet .

2 голосов
/ 18 сентября 2013

После добавления AttributeUsage обязательно добавьте это свойство в свой класс Attribute

public override object TypeId
{
  get
  {
    return this;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...