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