Ich entwerfe eine benutzerdefinierte Attributklasse.
%Vor%Dann versuche ich, dieses Attribut einer Eigenschaft in einer angrenzenden Klasse zuzuordnen:
%Vor%Der Compiler beschwört jedoch Folgendes:
'ValRange' ist kein gültiges benannter Attributargument, weil es kein gültiger Attributparametertyp
ist
Ich habe auch versucht, die ValueRange-Klasse in ein struct
zu konvertieren, in der Hoffnung, dass ein Werttyp das Problem lösen könnte. Gibt es einen Weg dazu?
Gibt es einen Weg dazu?
Nein.
Für weitere Details verweise ich auf Abschnitt 17.1.3 der C # 4-Spezifikation, die ich hier für Ihre Bequemlichkeit reproduzieren:
Die Typen von positionellen und benannten Parametern für eine Attributklasse sind auf die Attributparametertypen beschränkt, nämlich:
- Einer der folgenden Typen: bool, byte, char, double, float, int, lang, sbyte, short, string, uint, ulong, ushort.
- Das Typobjekt.
- Der Typ System.Type.
- Ein Aufzählungstyp, sofern er öffentlich zugänglich ist und die Typen, in denen er verschachtelt ist (falls vorhanden), auch öffentlich zugänglich sind.
- Eindimensionale Arrays der oben genannten Typen.
Ein Konstruktorargument oder ein öffentliches Feld, das keinen dieser Typen hat, kann nicht als positionaler oder benannter Parameter in einer Attributspezifikation verwendet werden.
Denken Sie daran, dass der Punkt eines Attributs zum Zeitpunkt der Kompilierung ist Informationen zu den Metadaten hinzufügen, die der Entität zugeordnet sind, auf die Sie das Attribut platziert haben. Das bedeutet, dass alle Informationen, die mit diesem Attribut verknüpft sind, eindeutig definiert sein müssen, um es in und aus Metadaten zu serialisieren. Durch die Beschränkung der gesetzmäßigen Typen auf eine kleine Teilmenge aller möglichen Typen stellen wir sicher, dass der Compiler immer legale Metadaten ausgibt, die der Konsument verstehen kann.
Attributparameterwerte müssen zur Kompilierzeit (d. h. Konstanten) auflösbar sein.
Siehe Attribute Parameter Types
auf MSDN:
Werte, die an Attribute übergeben werden, müssen dem Compiler zur Kompilierzeit bekannt sein.
Wenn Sie eine ValueRange
erstellen können, die eine Konstante ist, können Sie sie verwenden.
Attributparameter müssen Werte der folgenden Typen sein (zitiert den Artikel):
Bearbeiten: Die "Kompilierzeitkonstante" wurde auf "Wert" geändert, da Typen und Arrays keine Konstanten sind (dank des Kommentators, der darauf hingewiesen hat (und seinen Kommentar aus irgendeinem Grund gelöscht hat))
Attribute können nur Kompilierzeitkonstanten als Parameter empfangen (z. B. 3, "Hallo", typeof (MyClass), "Pfad zu einer Ressource, die alle nicht konstanten Daten definiert, die Sie benötigen").
Das letzte Beispiel (das Übergeben eines Typs), das ich angegeben habe, kann Ihnen beim Entwerfen einer Problemumgehung helfen (übergeben Sie einen Typ, der eine Schnittstelle mit der von Ihnen benötigten Methode implementiert).
Gibt es einen Weg dazu?
Ja.
Sie können Ihr Attribut eine Type
-Eigenschaft verwenden lassen und dann Typen verwenden, die eine definierte -Schnittstelle implementieren , für die der Code, der dieses Attribut verarbeitet, annehmen muss und als solche auch eine implizite , aber hoffentlich dokumentierte , Anforderung an seine Kunden erstellen:
Dies ist nicht vergleichbar mit vielen Klassen im Namespace System.ComponentModel
, wie DesignerAttribute
.
Tags und Links c# custom-attributes .net-3.5