2011-11-14 17 views
9

¿Existe alguna manera más clara de obtener el valor de caracteres de una enumeración en C#.Mejor forma de obtener Char Enum

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

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

OmG ... Bien que ha preguntado aquí. – nawfal

Respuesta

24

Sólo convertir el valor:

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

Tenga en cuenta que esto va a utilizar el valor en lugar del identificador. El valor Enums.DivisionStatus.Active es el código de carácter de 'A', ya que ese es el valor que ha definido.

Usar el valor directamente es más rápido que buscar el identificador para el valor.

+0

El tipo subyacente puede ser de cualquier tipo, excepto char: http://msdn.microsoft.com/en-us/library/sbbt4032(v=vs.80).aspx – phoog

+0

@phoog: Ya lo eliminé de la respuesta. – Guffa

+0

Creo que no lo expliqué correctamente. Si quisiera, tiene una cuerda como resultado final y no es un char. –

0

me acaba de emitir el valor de enumeración sin llamar ToString:

var status = (char)DivisionStatus.Active; 

O tal vez tenga que hacer

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

var status = (char)Enums.DivisionStatus.Active; debe hacer exactamente lo que quiere. La forma en que lo hacía antes no habría funcionado si el primer carácter del texto enum no coincidiera con el valor char subyacente.

Esto también funciona para enumeraciones que tienen un int como tipo de respaldo.

+0

La enumeración tiene un int como tipo de respaldo (ya que es el valor predeterminado). Los valores char que se usan en la definición se convierten implícitamente a valores int. – Guffa

0

trabajos de fundición simples, yo lo probé:

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

construyo un "pseudo-enumeración" que resuelve el problema. En su caso podría ser:

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

Usted puede usarlo como una enumeración que devuelve el valor de enumeración Char en ToString() sin calidad:

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

También podría usar una clase estática. Sin embargo, si siempre va a usar los valores como cadenas, podría simplemente hacer que cada propiedad sea una cadena. Una ventaja de este método es que puede agregar descripciones para cada elemento que se mostrará en 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'; 
} 
Cuestiones relacionadas