Puis-je initialiser un atsortingbut C # avec un tableau ou un nombre variable d’arguments?

Est-il possible de créer un atsortingbut pouvant être initialisé avec un nombre variable d’arguments?

Par exemple:

[MyCustomAtsortingbute(new int[]{ 3, 4, 5})] // this doesn't work public MyClass ... 

Les atsortingbuts prendront un tableau. Bien que si vous contrôlez l’atsortingbut, vous pouvez également utiliser des params (ce qui est plus agréable pour les consommateurs, IMO):

 class MyCustomAtsortingbute : Atsortingbute { public int[] Values { get; set; } public MyCustomAtsortingbute(params int[] values) { this.Values = values; } } [MyCustomAtsortingbute(3, 4, 5)] class MyClass { } 

Votre syntaxe pour la création de tableau est simplement désactivée:

 class MyCustomAtsortingbute : Atsortingbute { public int[] Values { get; set; } public MyCustomAtsortingbute(int[] values) { this.Values = values; } } [MyCustomAtsortingbute(new int[] { 3, 4, 5 })] class MyClass { } 

Vous pouvez le faire, mais ce n’est pas conforme à CLS:

 [assembly: CLSCompliant(true)] class Foo : Atsortingbute { public Foo(ssortingng[] vals) { } } [Foo(new ssortingng[] {"abc","def"})] static void Bar() {} 

Montre:

 Warning 1 Arrays as atsortingbute arguments is not CLS-compliant 

Pour une utilisation régulière de la reflection, il peut être préférable d’avoir plusieurs atsortingbuts, c’est-à-dire

 [Foo("abc"), Foo("def")] 

Cependant, cela ne fonctionnera pas avec TypeDescriptor / PropertyDescriptor , où seule une seule instance de n’importe quel atsortingbut est prise en charge (que ce soit le premier ou le dernier gain, je ne me souviens plus lequel).

Essayez de déclarer le constructeur comme ceci:

 public class MyCustomAtsortingbute : Atsortingbute { public MyCustomAtsortingbute(params int[] t) { } } 

Ensuite, vous pouvez l’utiliser comme:

[MyCustomAtsortingbute(3, 4, 5)]

Ça devrait aller. De la spécification, section 17.2:

Une expression E est une expression -argument-atsortingbut si toutes les instructions suivantes sont vraies:

  • Le type de E est un type de paramètre d’atsortingbut (§17.1.3).
  • Au moment de la compilation, la valeur de E peut être résolue comme suit:
    • Une valeur constante.
    • Un object System.Type.
    • Un tableau unidimensionnel d’ expressions-arguments d’ atsortingbuts .

Voici un exemple:

 using System; [AtsortingbuteUsage(AtsortingbuteTargets.All, AllowMultiple = false, Inherited = true)] public class SampleAtsortingbute : Atsortingbute { public SampleAtsortingbute(int[] foo) { } } [Sample(new int[]{1, 3, 5})] class Test { } 

Oui, mais vous devez initialiser le tableau que vous transmettez. Voici un exemple d’un test de ligne dans nos tests unitaires qui teste un nombre variable d’options de ligne de commande.

 [Row( new[] { "-l", "/port:13102", "-lfsw" } )] public void MyTest( ssortingng[] args ) { //... } 

Vous pouvez le faire. Un autre exemple pourrait être:

 class MyAtsortingbute: Atsortingbute { public MyAtsortingbute(params object[] args) { } } [MyAtsortingbute("hello", 2, 3.14f)] class Program { static void Main(ssortingng[] args) { } } 

Pour revenir sur la réponse de Marc Gravell, oui, vous pouvez définir un atsortingbut avec des parameters de tableau, mais appliquer un atsortingbut avec un paramètre de tableau n’est pas compatible avec CLS. Cependant, la simple définition d’un atsortingbut avec une propriété de tableau est parfaitement conforme à CLS.

Ce qui m’a fait comprendre que Json.NET, une bibliothèque compatible CLS, possède une classe d’atsortingbuts JsonPropertyAtsortingbute avec une propriété nommée ItemConverterParameters qui est un tableau d’objects.