Estou usando um atributo personalizado herdado de uma classe de atributo. Estou usando assim:
[MyCustomAttribute("CONTROL")]
[MyCustomAttribute("ALT")]
[MyCustomAttribute("SHIFT")]
[MyCustomAttribute("D")]
public void setColor()
{
}
Mas o erro "Duplicar atributo 'MyCustomAttribute'" é mostrado.
Como posso criar um atributo permitido duplicado?
c#
attributes
ebattulga
fonte
fonte
AttributeUsageAttribute ;-p
Observe, entretanto, que se você estiver usando ComponentModel (
TypeDescriptor
), ele suporta apenas uma instância de atributo (por tipo de atributo) por membro; reflexão crua suporta qualquer número ...fonte
A solução de Anton está correta, mas há outra pegadinha .
Resumindo, a menos que seu atributo customizado substitua TypeId, acessá-lo por meio de
PropertyDescriptor.GetCustomAttributes()
retornará apenas uma única instância de seu atributo.fonte
Por padrão, os
Attribute
s são limitados a serem aplicados apenas uma vez a um único campo / propriedade / etc. Você pode ver isso na definição daAttribute
classe no MSDN :Portanto, como outros observaram, todas as subclasses são limitadas da mesma maneira e, caso você precise de várias instâncias do mesmo atributo, é necessário definir explicitamente
AllowMultiple
comotrue
:Em atributos que permitem vários usos, você também deve substituir a
TypeId
propriedade para garantir que as propriedadesPropertyDescriptor.Attributes
funcionem conforme o esperado. A maneira mais fácil de fazer isso é implementar essa propriedade para retornar a própria instância do atributo:(Postar esta resposta não porque as outras estejam erradas, mas porque esta é uma resposta mais abrangente / canônica.)
fonte
Como alternativa, pense em redesenhar seu atributo para permitir uma sequência.
ou
em seguida, analise os valores para configurar seu atributo.
Para obter um exemplo disso, verifique AuthorizeAttribute no código-fonte ASP.NET MVC em www.codeplex.com/aspnet .
fonte
MyCustomAttribute
construtor pegue um array de strings, astring[]
, com ou sem oparams
modificador. Em seguida, ele pode ser aplicado com a sintaxe[MyCustom("CONTROL", "ALT", "SHIFT", "D")]
(comparams
).Depois de adicionar o AttributeUsage, certifique-se de adicionar esta propriedade à sua classe de atributo
fonte