2009-09-15 30 views
5

Oto kod chciałbym używać:Korzystanie enum jako argument atrybutu

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

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

EnumHelper wygląda następująco:

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

błąd pojawia się na EnumHelper (dni) jest to, że " Nazwa Enum nie jest ważna w tym momencie ". Czy robię coś złego, czy nie można tego zrobić?

WIĘCEJ INFO

Próbuję przekazać Enum (dni) oraz losowo wrócić jedną z wartości.

NEVERMIND: Komplikowałem tę część.

Odpowiedz

8

parametrów w atrybuty mogą być tylko stałymi. Jeśli chcesz przekazać typ enum należy zdać tylko typ:

[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; 
    } 
} 
0

parametr powinien być ENUM, a nie typu wyliczenia jak:

[EnumHelper(Days.Sat)] 
+2

To nie zadziała z powodu konwersji boksu z 'Days.Sat' na' Enum'. –

+1

Nie będzie? Zawsze uważałem przekazywanie wartości stałych za typy wartości działające z atrybutami. –

15

starasz się przekazać nazwę typu jakby to była wartość argumentem. Nie możesz tego zrobić. Można jednak zrobić:

[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; } 

Jednakże:

  • nie będę osobiście dokonać EnumType polu publicznej; sprawiają, że jest to własność.
  • Obecnie nie ma potwierdzenia, że ​​EnumType jest rzeczywiście wyliczenie. Nie możesz tego zrobić podczas kompilacji, ale możesz wykonać to w czasie wykonywania.
  • Dla konwencji, powinien być nazywany EnumHelperAttribute (lub coś bardziej opisowego, naprawdę) - to nie jest przyczyną błędu, ale jest to bardziej idiomatyczne
  • Nie jestem pewien, widzę korzyści .. możesz już znaleźć typ własności z metadanych; Jak myślisz, co to za atrybut kupujesz?

Jeśli możesz nam powiedzieć, co próbujesz osiągnąć, możemy być bardziej przydatni dla Ciebie.

0

Po prostu chciałem dodać, jak wpadłem na to i naprawiłem. Miałem moją własność nazwaną tak samo jak moje wyliczenie. Kod zostałby skompilowany i uruchomiony, ale otrzymywałbym komunikat o błędzie czerwonej linii w IDE. Zmiana nazwy właściwości na coś unikatowego wyczyściła wiadomość.

Powiązane problemy