11 Stimmen

Die Verwendung eines Enums als Argument für ein Attribut

Hier ist der Code den ich verwenden möchte:

public enum Days { Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri };

[EnumHelper(typeof(Days))]
public Days DayOfWeek { get; set; }

EnumHelper sieht so aus:

[AttributeUsage(AttributeTargets.Property,AllowMultiple=true)]
public class EnumHelper : Attribute
{
    public Type MyEnum { get; set; }
    public EnumHelper(Type enum)
    {
        MyEnum = enum;
    }
}

Der Fehler den ich bei EnumHelper(Days) erhalte ist, dass "Enum-Name an dieser Stelle ungültig ist". Mache ich etwas falsch oder ist dies nicht möglich?

Mehr Informationen

Ich versuche das Enum (Days) zu übergeben und zufällig einen der Werte zurückzubekommen.

17voto

Jon Skeet Punkte 1325502

Sie versuchen, einen Typnamen wie einen Argumentwert zu übergeben. Das geht nicht. Allerdings können Sie Folgendes tun:

[AttributeUsage(AttributeTargets.Property,AllowMultiple=true)]
public class EnumHelper : Attribute
{
    public Type EnumType;
    public EnumHelper(Type enumType)
    {
        EnumType = enumType;
    }
}

...

[EnumHelper(typeof(Days))]
public Days DayOfWeek { get; set; }

Allerdings:

  • Ich würde persönlich EnumType nicht als öffentliches Feld machen; machen Sie es zu einer Eigenschaft.
  • Derzeit gibt es keine Validierung, ob EnumType tatsächlich ein enum ist. Das können Sie nicht zur Compile-Zeit machen, aber zur Ausführungszeit könnten Sie es tun.
  • Allein schon aus Konvention sollte es EnumHelperAttribute genannt werden (oder etwas noch beschreibenderes, wirklich) - das verursacht keinen Fehler, ist aber idiomatischer.
  • Ich bin mir nicht sicher, welchen Nutzen... Sie können den Typ der Eigenschaft bereits aus den Metadaten herausfinden; was denken Sie, was Ihnen das Attribut tatsächlich bringt?

Wenn Sie uns mitteilen könnten, was Sie erreichen möchten, könnten wir Ihnen vielleicht besser helfen.

12voto

TcKs Punkte 24671

Die Parameter in Attributen können nur Konstanten sein. Wenn Sie den Enum-Typ übergeben möchten, müssen Sie nur den Typ übergeben:

[EnumHelper(typeof(Days))]
public Days DayOfWeek { get; set; }

[AttributeUsage(AttributeTargets.Property,AllowMultiple=true)]
public class EnumHelper : Attribute
{
    public Type MyEnum;
    public EnumHelper(Type enum)
    {
        MyEnum = enum;
    }
}

0voto

Philippe Leybaert Punkte 161931

Der Parameter sollte ein enum-Wert sein, nicht ein enum-Typ, wie:

[EnumHelper(Days.Sat)]

3 Stimmen

Das wird nicht funktionieren aufgrund der Konvertierung von Days.Sat zu Enum.

1 Stimmen

Es wird nicht? Ich dachte immer, dass das Übergeben von Konstantenwerten als Werttypen bei Attributen funktioniert.

0voto

ouflak Punkte 2397

Ich wollte nur hinzufügen, wie ich auf dieses Problem gestoßen bin und es behoben habe. Ich hatte meine Eigenschaft mit demselben Namen wie meine Aufzählung. Der Code würde kompilieren und ausgeführt werden, aber ich bekam eine rote Fehlermeldung in der IDE. Das Ändern des Namens der Eigenschaft auf etwas Eindeutiges hat die Meldung beseitigt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X