J'utilise un attribut personnalisé hérité d'une classe d'attributs. Je l'utilise comme ceci:
[MyCustomAttribute("CONTROL")]
[MyCustomAttribute("ALT")]
[MyCustomAttribute("SHIFT")]
[MyCustomAttribute("D")]
public void setColor()
{
}
Mais l'erreur "Dupliquer l'attribut 'MyCustomAttribute'" s'affiche.
Comment puis-je créer un attribut autorisé en double?
c#
attributes
ebattulga
la source
la source
AttributeUsageAttribute ;-p
Notez, cependant, que si vous utilisez ComponentModel (
TypeDescriptor
), il ne prend en charge qu'une seule instance d'attribut (par type d'attribut) par membre; la réflexion brute prend en charge n'importe quel nombre ...la source
La solution d'Anton est correcte, mais il y a un autre piège .
En bref, à moins que votre attrbiute personnalisé ne remplace TypeId, y accéder via
PropertyDescriptor.GetCustomAttributes()
ne renverra qu'une seule instance de votre attribut.la source
Par défaut, les
Attribute
s sont limités à être appliqués une seule fois à un seul champ / propriété / etc. Vous pouvez le voir à partir de la définition de laAttribute
classe sur MSDN :Par conséquent, comme d'autres l'ont noté, toutes les sous-classes sont limitées de la même manière, et si vous avez besoin de plusieurs instances du même attribut, vous devez définir explicitement
AllowMultiple
surtrue
:Sur les attributs qui autorisent plusieurs utilisations, vous devez également remplacer la
TypeId
propriété pour vous assurer que des propriétés telles quePropertyDescriptor.Attributes
fonctionnent comme prévu. Le moyen le plus simple de le faire est d'implémenter cette propriété pour renvoyer l'instance d'attribut elle-même:(Publier cette réponse non pas parce que les autres ont tort, mais parce que c'est une réponse plus complète / canonique.)
la source
Comme alternative, pensez à repenser votre attribut pour permettre une séquence.
ou
puis analysez les valeurs pour configurer votre attribut.
Pour un exemple de cela, consultez le code source AuthorizeAttribute dans ASP.NET MVC à l' adresse www.codeplex.com/aspnet .
la source
MyCustomAttribute
constructeur prenne un tableau de chaînes, astring[]
, avec ou sans leparams
modificateur. Ensuite, il pourrait être appliqué avec la syntaxe[MyCustom("CONTROL", "ALT", "SHIFT", "D")]
(avecparams
).Une fois que vous avez ajouté AttributeUsage, assurez-vous d'ajouter cette propriété à votre classe d'attribut
la source