2012-09-13 31 views
6

Estoy tratando de asignar una cadena a una enumeración. Algo así como el siguiente ejemplo:¿Cómo puedo asignar una cadena a una enumeración en lugar de un valor entero en C#?

enum MyEnum 
    { 
     frist = "First Value", 
     second = "Second Value", 
     third = "Third Value" 
    } 

Para que pueda tener algo como esto en mi código:

MyEnum enumVar = MyEnum.first; 
... 
string enumValue = EnumVar.ToString();//returns "First Value" 

En forma convencional cuando creo una enumeración, el ToString() devolverá el nombre enumeraciones no es su valor. Por lo tanto, no es deseable ya que estoy buscando una manera de asignar un valor de cadena y luego sacar ese valor de cadena de una enumeración.

+8

http://stackoverflow.com/questions/3501966/enums-with-string-values-and-finding-enum-by-value?rq=1 –

+0

¿Qué quieres eso? –

+0

@RaphaelAlthaus: ¿Lo publicaría como respuesta? – Breeze

Respuesta

16

Puede agregar un atributo de Descripción a su enumeración.

enum MyEnum 
    { 
     [Description("First Value")] 
     frist, 
     [Description("Second Value")] 
     second, 
     [Description("Third Value")] 
     third, 
    } 

Luego, tenga un método para devolver la descripción.

public static string GetEnumDescription(Enum value) 
     { 
      FieldInfo fi = value.GetType().GetField(value.ToString()); 

      DescriptionAttribute[] attributes = 
       (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 

      if (attributes != null && attributes.Length > 0) 
       return attributes[0].Description; 
      else 
       return value.ToString(); 
     } 

entonces usted puede hacer:

MyEnum enumVar = MyEnum.frist; 
    string value = GetEnumDescription(enumVar); 

valor sostendrá "Primer valor"

Usted puede ver: Associating Strings with enums in C#

+0

Muchas gracias :) es realmente limpio y exactamente lo que yo estaba buscando :) – Breeze

+0

@Hossein, eres bienvenido – Habib

+0

Bien, no sabía de esto. +1. –

5

No puede el valor de una enumeración es siempre un número entero

Lo más cerca que se puede llegar es una clase estática con un conjunto de propiedades estáticas

static class MyValues 
{ 
    public static readonly string First = "First Value"; 
    public static readonly string Second = "Second Value"; 
    public static readonly string Third = "Third Value"; 
} 
+1

No necesariamente, cualquier tipo integral excepto 'char' es válido. El valor predeterminado es 'int' – Dervall

+2

@Dervall No escribí int pero entero (no es un tipo en C# sino una palabra en inglés) –

+0

const string lo haría bien ¿no? porque const es estático y de solo lectura al mismo tiempo. ¿Estoy en lo cierto? – Breeze

1

No se puede hacer eso. enum s se basan en enteros, no en cadenas.

0

Los tipos aprobados para una enumeración son bytes, sbyte, short, ushort, int, uint, long o ulong. así como una cuerda de la única cosa que pueda para es

enumeración MyEnum { primera, segunda , tercer }

MyEnum.first.ToString();

o me gusta usando la reflexión y ve a usar la descripción como un atributo para los campos en la enumeración.

0
enum MyEnum 
{ 
    FirstValue, //Default Value will be 0 
    SecondValue, // 1 
    ThirdValue // 2 
} 

string str1 = Enum.GetName(typeof(MyEnum), 0); //will return FirstValue 
string str2 = Enum.GetName(typeof(MyEnum), MyEnum.SecondValue); //SecondValue 

si necesita una cadena completa como espacios, etc., debe ir agregando el enfoque de Descripción. De lo contrario, recomiendo simplemente crear un diccionario de búsqueda.

 string value = MyLookupTable.GetValue(1); // First Value 
    value = MyLookupTable.GetValue(2); // Second Value 
    value = MyLookupTable.GetValue(3); // Third Value 

class MyLookupTable 
{ 
    private static Dictionary<int, string> lookupValue = null; 

    private MyLookupTable() {} 

    public static string GetValue(int key) 
    { 
     if (lookupValue == null || lookupValue.Count == 0) 
      AddValues(); 

     if (lookupValue.ContainsKey(key)) 
      return lookupValue[key]; 
     else 
      return string.Empty; // throw exception 
    } 

    private static void AddValues() 
    { 
     if (lookupValue == null) 
     { 
      lookupValue = new Dictionary<int, string>(); 
      lookupValue.Add(1, "First Value"); 
      lookupValue.Add(2, "Second Value"); 
      lookupValue.Add(3, "Third Value"); 
     } 
    } 
} 
Cuestiones relacionadas