Ist es möglich, ein Attribut zu erstellen, das mit einer variablen Anzahl von Argumenten initialisiert werden kann?
Beispielsweise:
[MyCustomAttribute(new int[3,4,5])] // this doesn't work
public MyClass ...
c#
attributes
Crono
quelle
quelle
Antworten:
Attribute nehmen ein Array an. Wenn Sie das Attribut steuern, können Sie
params
stattdessen auch Folgendes verwenden (was für Verbraucher besser ist, IMO):Ihre Syntax für die Array-Erstellung ist zufällig deaktiviert:
quelle
Sie können es tun, aber es ist nicht CLS-konform:
Zeigt an:
Für die regelmäßige Verwendung von Reflexionen kann es vorzuziehen sein, mehrere Attribute zu haben, d. H.
Dies funktioniert jedoch nicht mit
TypeDescriptor
/PropertyDescriptor
, wo nur eine einzige Instanz eines Attributs unterstützt wird (entweder der erste oder der letzte Gewinn, ich kann mich nicht erinnern, welcher).quelle
Versuchen Sie, den Konstruktor wie folgt zu deklarieren:
Dann können Sie es wie folgt verwenden:
[MyCustomAttribute(3, 4, 5)]
quelle
Das sollte okay sein. Aus der Spezifikation, Abschnitt 17.2:
Ein Ausdruck E ist ein Attribut-Argument-Ausdruck, wenn alle folgenden Aussagen wahr sind:
Hier ist ein Beispiel:
quelle
Ja, aber Sie müssen das übergebene Array initialisieren. Hier ist ein Beispiel aus einem Zeilentest in unseren Komponententests, bei dem eine variable Anzahl von Befehlszeilenoptionen getestet wird.
quelle
Du kannst das tun. Ein anderes Beispiel könnte sein:
quelle
Um auf Marc Gravells Antwort zurückzugreifen, können Sie ein Attribut mit Array-Parametern definieren, aber das Anwenden eines Attributs mit einem Array-Parameter ist nicht CLS-kompatibel. Das Definieren eines Attributs mit einer Array-Eigenschaft ist jedoch perfekt CLS-kompatibel.
Mir wurde klar, dass Json.NET, eine CLS-kompatible Bibliothek, eine Attributklasse JsonPropertyAttribute mit einer Eigenschaft namens ItemConverterParameters hat, die ein Array von Objekten ist.
quelle