Est-il possible de créer un attribut qui peut être initialisé avec un nombre variable d'arguments?
Par exemple:
[MyCustomAttribute(new int[3,4,5])] // this doesn't work
public MyClass ...
c#
attributes
Crono
la source
la source
Réponses:
Les attributs prendront un tableau. Cependant, si vous contrôlez l'attribut, vous pouvez également utiliser à la
params
place (ce qui est plus agréable pour les consommateurs, l'OMI):Votre syntaxe pour la création de tableaux se trouve être désactivée:
la source
Vous pouvez le faire, mais ce n'est pas conforme CLS:
Spectacles:
Pour une utilisation régulière de la réflexion, il peut être préférable d'avoir plusieurs attributs, c'est-à-dire
Cependant, cela ne fonctionnera pas avec
TypeDescriptor
/PropertyDescriptor
, où une seule instance d'un attribut est prise en charge (le premier ou le dernier gagne, je ne me souviens pas lequel).la source
Essayez de déclarer le constructeur comme ceci:
Ensuite, vous pouvez l'utiliser comme:
[MyCustomAttribute(3, 4, 5)]
la source
Cela devrait être correct. D'après la spécification, section 17.2:
Une expression E est une expression -argument-attribut si toutes les déclarations suivantes sont vraies:
Voici un exemple:
la source
Oui, mais vous devez initialiser le tableau que vous transmettez. Voici un exemple tiré d'un test de ligne dans nos tests unitaires qui teste un nombre variable d'options de ligne de commande;
la source
Vous pouvez le faire. Un autre exemple pourrait être:
la source
Pour reprendre la réponse de Marc Gravell, oui, vous pouvez définir un attribut avec des paramètres de tableau, mais l'application d'un attribut avec un paramètre de tableau n'est pas conforme à CLS. Cependant, la simple définition d'un attribut avec une propriété de tableau est parfaitement conforme à CLS.
Ce qui m'a fait réaliser cela, c'est que Json.NET, une bibliothèque compatible CLS, a une classe d'attributs JsonPropertyAttribute avec une propriété nommée ItemConverterParameters qui est un tableau d'objets.
la source