2010-07-02 15 views
5

Ho un enum:C# Accendere enumerazioni

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

Ora su una certa pagina desidero elencare questo enum in un CheckBoxList. Questo andrebbe bene tranne che voglio che il testo di ogni checkbox mostri un testo diverso dall'enum.

cioè le caselle di controllo dovrebbe dire:

"non elaborati" invece di "Incomplete"

"lavorati" invece di "Complete"

"Void" invece di "Annullato"

E 'possibile mettere questo enum in un foreach e quindi accendere lo stato e aggiornare il testo. Così:

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

Qualsiasi idea sarebbe molto apprezzata.

risposta

14

C# ha una funzione di lingua che indirizza direttamente la tua domanda. Here's an article che ti dà i dettagli completi.

La versione corta: applicare i valori degli attributi di estensione per ogni valore:

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

applicano Poi detti valori alla radio-pulsanti, ListBox o qualunque:

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

Mi sembra questo sta creando un nuovo attributo (EnumValueDataAttribute) per il quale esiste già un (System.ComponentModel.DescriptionAttribute). Funziona, ma mi chiedo perché ne crei uno nuovo piuttosto che usare DescriptionAttribute? – TLiebe

+0

@TLiebe - buon punto. Sono vittima di anni di standard di codifica artificialmente imposti. Questo è il modo in cui gli sviluppatori che ho aderito lo stavano facendo. Non rompo il modello; rende per le recensioni di codice brutto! :) –

0

È possibile inserire la stringa di modifica in un array e quindi utilizzare l'indice enum per accedere all'elemento array.

10

È possibile utilizzare Description attribute nella classe System.ComponentModel per assegnare una descrizione testuale a ciascun valore enum. È quindi possibile impostare la proprietà text iterando attraverso l'enum e ottenendo l'attributo Description di ciascuno invece di utilizzare uno switch.

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

È quindi possibile utilizzare qualcosa come il seguente per ottenere la descrizione di un singolo valore enum (o modificarlo per restituire un dizionario come Bob ha mostrato nel suo esempio):

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

May I nitpick? Volevo solo sottolineare che, nel codice "reale", probabilmente si desidera qualcosa di più robusto degli attributi [0]. Inoltre, sono abbastanza sicuro che provi/prendi il male puro, ma ci sono altri fili su quell'argomento. Proverò questa soluzione in futuro. Grazie per la condivisione! – apollodude217

+0

Il pignoleria costruttivo è sempre il benvenuto. I tuoi punti sono buoni e mentre ammetterò che il codice è mio, mi difenderò con la scusa (dichiaratamente povera) che è vecchia e tratta dal primissimo codice .NET che ho scritto. – TLiebe