benannte Parameter Typ Einschränkungen

7

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?

    
Feisty Mango 27.04.2011, 19:53
quelle

5 Antworten

21
  

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.

    
Eric Lippert 27.04.2011, 19:58
quelle
2

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.

    
Oded 27.04.2011 19:56
quelle
1

Attributparameter müssen Werte der folgenden Typen sein (zitiert den Artikel):

  • Einfache Typen (bool, byte, char, short, int, long, float und double)
  • Zeichenfolge
  • System.Type
  • enums
  • object (Das Argument eines Attributparameters vom Typ object muss ein konstanter Wert eines der obigen Typen sein.)
  • Eindimensionale Arrays der oben genannten Typen

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))

    
Aasmund Eldhuset 27.04.2011 19:57
quelle
1

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).

    
Danny Varod 27.04.2011 19:58
quelle
1
  

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:

%Vor%

Dies ist nicht vergleichbar mit vielen Klassen im Namespace System.ComponentModel , wie DesignerAttribute .

    
Jordão 01.05.2011 03:40
quelle

Tags und Links