usage property custom attributetargets attribute attrib c# attributes

property - reflection c#



Cómo crear atributos duplicados permitidos (6)

AttributeUsageAttribute ;-p

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

Sin embargo, tenga en cuenta que si está utilizando ComponentModel ( TypeDescriptor ), solo admite una instancia de atributo (por tipo de atributo) por miembro. reflexión cruda admite cualquier número ...

Estoy usando un atributo personalizado heredado de una clase de atributo. Lo estoy usando así:

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

Pero se muestra el error "Duplicar ''MyCustomAttribute'' attribute".
¿Cómo puedo crear un atributo permitido duplicado?


Como alternativa, piense en rediseñar su atributo para permitir una secuencia.

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

o

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

luego analiza los valores para configurar tu atributo.

Para ver un ejemplo de esto, consulte el atributo AuthorizeAttribute en ASP.NET MVC en www.codeplex.com/aspnet .


Después de agregar AttributeUsage, asegúrese de agregar esta propiedad a su clase de atributo

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


Pegue un atributo AttributeUsage en su clase de atributo (sí, eso es AllowMultiple ) y establezca AllowMultiple en true :

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


Por defecto, los Attribute están limitados a ser aplicados solo una vez a un solo campo / propiedad / etc. Puede ver esto desde la definición de la clase de Attribute en MSDN :

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

Por lo tanto, como han señalado otros, todas las subclases están limitadas de la misma manera, y si necesita varias instancias del mismo atributo, necesita establecer explícitamente AllowMultiple en true :

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

En los atributos que permiten usos múltiples, también debe anular la propiedad TypeId para garantizar que las propiedades como PropertyDescriptor.Attributes funcionen como se esperaba. La forma más fácil de hacerlo es implementar esa propiedad para devolver la instancia del atributo en sí:

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

(Publicar esta respuesta no porque los demás estén equivocados, sino porque esta es una respuesta más completa / canónica).


La solución de Anton es correcta, pero hay otra gotcha .

En resumen, a menos que su attrbiute personalizado anule TypeId, acceder a él a través de PropertyDescriptor.GetCustomAttributes () solo devolverá una única instancia de su atributo.