Kann ich mit einem auflistungsinitialisierer für ein Attribut?
Kann ein Attribut in C# verwendet werden, mit einem auflistungsinitialisierer?
Zum Beispiel, würde ich mag, um etwas zu tun, wie die folgenden:
[DictionaryAttribute(){{"Key", "Value"}, {"Key", "Value"}}]
public class Foo { ... }
Ich weiß, können Attribute besitzen benannte Parameter, und da scheint ziemlich ähnlich zu Objekt-Initialisierungen, ich Frage mich, ob die auflistungsinitialisierer wurden ebenfalls angeboten.
- Scott, es tut mir Leid - meine Antwort ist fehlgeschlagen. Ich nicht verdienen Sie bis Stimme. Bitte Stimmen Sie unten cos seine fair-play.
- Sie sollten nicht Ihre Antwort gelöscht! Manchmal ist die falsche Antwort ist noch hilfreich ... nur aktualisieren Sie Ihre Antwort nächste Zeit, so dass die Menschen verstehen, warum es falsch ist.
- Ok. 🙂 Ich habe es wiederherstellen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Update: tut mir Leid das ich mich Irre - array von benutzerdefinierten Typ ist unmöglich 🙁
Quelle: stackoverflow.
KÖNNEN Sie DEKLARIEREN ein array übergeben, von einem benutzerdefinierten Typ:
aber der Kompilierung Fehler auftreten, auf die Attribut-Deklaration:
params
in es, lassen Sie sich dienew[]{...}
für eine viel schönere syntax. Jedoch sind Sie sicher, dass dies kompiliert? Ich denke Attribut Argumente haben Grenzen -- konstanter Ausdruck, typeof-Ausdruck oder ein array creation expression -- wie erwähnt wurde von @Jason nach Unten.Abschnitt 17.1.3 der C# - 4.0-Spezifikation, die speziell die nicht für mehrdimensionale arrays innerhalb der Attribut-Parameter, so dass während Foo(string[,] bar) erlauben könnte, Sie zum Aufruf von Foo(new [,] {{"a", "b"}, {"key2", "Wert2"}}), ist es leider nicht verfügbar für Attribute.
Also, denken Sie daran, ein paar Möglichkeiten, um Ungefähre, was Sie wollen, sind:
Benutzen ein eindimensionales array mit alternierenden Schlüssel-Wert-Paare. Der offensichtliche Nachteil dieses Ansatzes ist, dass es nicht gerade die Durchsetzung der Namen und Werte.
Ermöglichen, Ihre parameter angezeigt, die mehrere Male durch tagging Ihre Attribut-definition mit dem folgenden Attribut:
In diesem way, Sie können nun definieren:
Dies ist ein bisschen wordier als das, was ich bin sicher, dass Sie wurden Hoffnung für, aber es macht eine klare Unterscheidung zwischen dem Namen und Werte.
Finden Sie eine JSON-Paket und bieten einen Initialisierer für das Attribut. Die Leistung trifft, ist belanglos, da diese während der code-Initialisierung. Mit Newtonsoft.Json zum Beispiel könnten Sie ein Attribut wie so:
Die es erlaubt, dass Sie instanziieren ein Attribut wie so:
Ich weiß, es ist ein kleines Zitat-happy, viel mehr beteiligt, aber es gibt Sie. Unabhängig davon, in dieser verrückten dynamischen Welt, zu wissen, wie Sie initialisiert werden die Objekte mit JSON ist keine schlechte Fähigkeit zu haben, in Ihrer Hosentasche.
[IsRequired(new[] {"CountryId"}, new[]{"1"})]
Die kurze Antwort ist Nein.
Längere Antwort: In Ordnung für eine Klasse zu unterstützen, die auflistungsinitialisierer, die es braucht, um IEnumerable implementieren und es muss eine add-Methode. So zum Beispiel:
Kann ich dann dies tun:
Also mit diesem, lassen Sie uns versuchen, es zu machen, arbeiten für ein Attribut. (Randbemerkung, da Attribute nicht unterstützen, Generika, ich bin nur hartzucodieren es mit strings zum testen) :
Und jetzt, um es zu testen:
ist, und das nicht kompilieren 🙁 ich bin nicht sicher, wo die Begrenzung ist genau, ich vermute Attribute sind nicht newed denselben Weg auf ein reguläres Objekt ist und daher dies nicht unterstützt. Ich würde gespannt sein, ob dies theoretisch möglich ist, unterstützt von einer zukünftigen version der Sprache....
Attribute
unterstützt.