Ответ 1
Прикрепите атрибут AttributeUsage
к вашему классу атрибутов (yep, that mouthful) и установите AllowMultiple
в true
:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public sealed class MyCustomAttribute: Attribute
Я использую настраиваемый атрибут, унаследованный от класса атрибута. Я использую его следующим образом:
[MyCustomAttribute("CONTROL")]
[MyCustomAttribute("ALT")]
[MyCustomAttribute("SHIFT")]
[MyCustomAttribute("D")]
public void setColor()
{
}
Но отображается ошибка "Duplicate" MyCustomAttribute "атрибут".
Как создать дублированный разрешенный атрибут?
Прикрепите атрибут AttributeUsage
к вашему классу атрибутов (yep, that mouthful) и установите AllowMultiple
в true
:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public sealed class MyCustomAttribute: Attribute
AttributeUsageAttribute;-p
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyAttribute : Attribute
{}
Обратите внимание, что если вы используете ComponentModel (TypeDescriptor
), он поддерживает только один экземпляр атрибута (по типу атрибута) для каждого члена; необработанное отражение поддерживает любое число...
Решение Антона корректно, но есть еще одна версия.
Короче говоря, если ваш пользовательский attrbiute не отменяет TypeId, то доступ к нему через PropertyDescriptor.GetCustomAttributes() будет возвращать только один экземпляр вашего атрибута.
В качестве альтернативы подумайте о перепроектировании вашего атрибута, чтобы разрешить последовательность.
[MyCustomAttribute(Sequence="CONTROL,ALT,SHIFT,D")]
или
[MyCustomAttribute("CONTROL-ALT-SHIFT-D")]
затем проанализируйте значения, чтобы настроить свой атрибут.
Для примера ознакомьтесь с авторизованным атрибутом в исходном коде ASP.NET MVC на www.codeplex.com/aspnet.
По умолчанию 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;
}
}
}
(Проводя этот ответ не потому, что другие ошибаются, а потому, что это более полный/канонический ответ.)
После добавления AttributeUsage убедитесь, что вы добавили это свойство в свой класс Attribute
public override object TypeId
{
get
{
return this;
}
}