2010-07-02 19 views
5

Ich habe eine Enum:C# einschalten Aufzählungen

public enum Status 
{ 
    Incomplete = 1, Complete = 2, Cancelled = 3, Deleted = 4 
} 

Jetzt auf einer bestimmten Seite Ich möchte diese Enum in einer Checkboxlist aufzulisten. Dies wäre in Ordnung, außer dass der Text jedes Kontrollkästchens einen anderen Text als die Enumeration anzeigen soll.

dh die Kontrollkästchen sollte sagen:

"nicht verarbeitet" anstelle von "Incomplete"

"verarbeitet" anstelle von "Complete"

"Void" statt "Cancelled"

Ist es möglich, diese Enum in eine foreach zu setzen und dann den Status zu aktivieren und den Text zu aktualisieren. Wie so:

var statuses = Enum.GetNames(typeof(Status)); 
foreach (var status in statuses))) 
{ 
    switch (status) 
    { 
     case Status.Complete.ToString(): 
     status = "Processed"; 
     break; ...etc     
    } 
} 

Irgendwelche Ideen würden sehr geschätzt.

Antwort

14

C# verfügt über eine Sprachfunktion, die Ihre Frage direkt anspricht. Here's an article das gibt Ihnen die vollständigen Details.

Die kurze Version: Erweiterung Attributwerte für jeden Wert gelten:

enum OrderStatus 
{ 
    [EnumValueData(Name="New Order")] 
    NewOrder = 1, 
    [EnumValueData(Name="In Process")] 
    Processing = 2, 
    [EnumValueData(Name="Shipped")] 
    Shipped = 3 
} 

Dann sagte gelten Werte zu Ihrem Radio-Buttons, listbox oder was auch immer:

public static Dictionary<int, string> GetListItems(Type enumType) 
{ 
    if (!enumType.IsEnum) 
     throw new ApplicationException("GetListItems does not support non-enum types"); 
    Dictionary<int, string> list = new Dictionary<int, string>(); 
    foreach(FieldInfo field in enumType.GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public)) 
    { 
     int value; 
     string display; 
     value = (int)field.GetValue(null); 
     display = Enum.GetName(enumType, value); 
     foreach(Attribute currAttr in field.GetCustomAttributes(true)) 
     { 
      EnumValueDataAttribute valueAttribute = currAttr as EnumValueDataAttribute; 
      if (valueAttribute != null) 
       display = valueAttribute.Name; 
     } 
     list.Add(value, display); 
    } 
    return list; 
} 
+10

mir scheint, Dadurch wird ein neues Attribut (EnumValueDataAttribute) erstellt, für das bereits ein Attribut vorhanden ist (System.ComponentModel.DescriptionAttribute). Es funktioniert, aber ich frage, warum Sie ein neues erstellen würden, anstatt DescriptionAttribute zu verwenden? – TLiebe

+0

@TLiebe - guter Punkt. Ich bin das Opfer jahrelanger künstlich auferlegter Codierstandards. So haben die Entwickler, denen ich beigetreten bin, das gemacht. Ich breche kein Muster; macht böse Code-Reviews! :) –

0

Sie Ihre Modification Zeichenfolge setzen können in einem Array und verwenden Sie dann den enum-Index, um auf das Array-Element zuzugreifen.

10

Sie können die Description attribute in der System.ComponentModel-Klasse verwenden, um jedem Enum-Wert eine Textbeschreibung zuzuweisen. Sie können die Texteigenschaft dann festlegen, indem Sie die Enumeration durchlaufen und das Attribut Description für jedes Attribut abrufen, anstatt einen Schalter zu verwenden.

public enum Status 
{ 
    [Description("Not Processed")] Incomplete = 1, 
    [Description("Processed")] Complete = 2, 
    [Description("Void")] Cancelled = 3, 
    Deleted = 4 
} 

Sie dann so etwas wie die folgenden bekommen, die Beschreibung eines einzelnen ENUM-Wert verwenden könnte (oder ändern Sie es ein Wörterbuch zurückzukehren als Bob in seinem Beispiel gezeigt):

public static string GetEnumDescription (Object value) 
    { 
     try 
     { 
      Type objType = value.GetType(); 
      FieldInfo fldInf = objType.GetField(Enum.GetName(objType, value)); 

      Object[ ] attributes = fldInf.GetCustomAttributes(false); 

      if (attributes.Length > 0) 
      { 
       DescriptionAttribute descAttr = (DescriptionAttribute)attributes[ 0 ]; 
       return descAttr.Description; 
      } 
      else 
      { 
       return value.ToString(); 
      } 
     } 
     catch 
     { 
      return string.Empty; 
     } 
    } 
+1

Darf ich nitpick? Ich wollte nur darauf hinweisen, dass Sie in "echtem" Code wahrscheinlich etwas robusteres wollen als Attribute [0]. Außerdem bin ich mir ziemlich sicher, dass ich reines Böses versuchen/fangen soll, aber es gibt andere Threads zu diesem Thema. Ich werde diese Lösung in Zukunft versuchen. Danke für das Teilen! – apollodude217

+0

Konstruktive Nitpicking ist immer willkommen. Ihre Punkte sind gut und während ich zugeben werde, dass der Code mein eigener ist, werde ich mich mit der (zugegeben armen) Ausrede verteidigen, dass sie alt ist und aus irgendeinem der allerersten .NET-Codes, die ich geschrieben habe. – TLiebe