2011-11-14 6 views
9

Esiste un modo più semplice per ottenere il valore char di un enum in C#.Miglior modo per ottenere Enum Ennet

public enum DivisionStatus 
     { 
      None = 'N', 
      Active = 'A', 
      Inactive = 'I', 
      Waitlist = 'W' 
     } 

string status = Enums.DivisionStatus.Active.ToString()[0].ToString(); // "A" 
+0

OmG ... Bene che hai chiesto qui. – nawfal

risposta

24

Proprio il cast del valore:

char status = (char)Enums.DivisionStatus.Active; 

Si noti che questa utilizzerà il valore anziché l'identificativo. Il valore Enums.DivisionStatus.Active è il codice carattere di 'A', poiché questo è il valore che è stato definito.

L'utilizzo diretto del valore è più rapido della ricerca dell'identificatore per il valore.

+0

Il tipo sottostante può essere qualsiasi tipo integrale eccetto char: http://msdn.microsoft.com/en-us/library/sbbt4032(v=vs.80).aspx – phoog

+0

@phoog: l'ho già rimosso dalla risposta. – Guffa

+0

Penso di non averlo spiegato correttamente. Se volessi, ha una stringa come risultato finale e non un carattere. –

0

vorrei solo il cast del valore enum senza chiamare ToString:

var status = (char)DivisionStatus.Active; 

O forse avresti bisogno di fare

var status = (char)(int)DivisionStatus.Active; 
1

var status = (char)Enums.DivisionStatus.Active; dovrebbe fare esattamente quello che vuoi. Il modo in cui lo stavate facendo prima non avrebbe funzionato se il primo carattere del testo enumerato non corrispondesse al valore del char sottostante.

Questo funziona anche per le enumerazioni che hanno un int come un tipo di supporto.

+0

L'enum ha un int come tipo di supporto (come impostazione predefinita). I valori char utilizzati nella definizione vengono convertiti implicitamente in valori int. – Guffa

0

semplici lavori di fusione, ho provato:

using System; 

public enum DivisionStatus 
{ 
    None = 'N', 
    Active = 'X', 
    Inactive = 'I', 
    Waitlist = 'W' 
} 

class Program 
{ 
    public static void Main() 
    { 
    var ds = DivisionStatus.Active; 
    Console.WriteLine((char)ds); 
    } 
} 
2

ho costruire una "pseudo-enum" che risolve il problema. Nel tuo caso potrebbe essere simile:

public class DivisionStatus 
{ 
    public static readonly DivisionStatus None = new DivisionStatus('N'); 
    public static readonly DivisionStatus Active = new DivisionStatus('A'); 
    public static readonly DivisionStatus Inactive = new DivisionStatus('I'); 
    public static readonly DivisionStatus Waitlist = new DivisionStatus('W'); 

    internal char Value { get; private set; } 

    public override string ToString() 
    { 
     return Value.ToString(); 
    } 

    protected DivisionStatus(char value) 
    { 
     this.Value = value; 
    } 
} 

è possibile utilizzarlo come un enum che restituisce il valore enum char sul ToString() senza casting:

Console.WriteLine(DivisionStatus.None); // returns 'N' 
1

Si potrebbe anche usare una classe statica. Sebbene, se utilizzerai sempre i valori come stringhe, potresti semplicemente rendere ogni proprietà una stringa. Un vantaggio di questo metodo è che è possibile aggiungere descrizioni per ciascun elemento che verrà visualizzato in InteliSense.

public static class DivisionStatus 
{ 
    /// <summary> 
    /// Some information about None 
    /// </summary> 
    public const char None = 'N'; 
    /// <summary> 
    /// Some information about Active, blah blah 
    /// </summary> 
    public const char Active = 'A'; 
    /// <summary> 
    /// Some information about Inactive, blah blah 
    /// </summary> 
    public const char Inactive = 'I'; 
    /// <summary> 
    /// Some information about Waitlist, blah blah 
    /// </summary> 
    public const char Waitlist = 'W'; 
} 
Problemi correlati