Nombre de cadena de enumeración del valor


407

Tengo una construcción de enumeración como esta:

public enum EnumDisplayStatus
{
    None    = 1,
    Visible = 2,
    Hidden  = 3,
    MarkedForDeletion = 4
}

En mi base de datos, las enumeraciones están referenciadas por valor. Mi pregunta es, ¿cómo puedo convertir la representación numérica de la enumeración en el nombre de la cadena.

Por ejemplo, dado 2el resultado debe ser Visible.


25
Creo que ahora hay una manera más fácil de hacer esto con VS 2015 nameof(EnumDisplayStatus.Visible)Espero que ayude a alguien
Gabriel Marius Popescu

Respuestas:


542

Puede convertir la intparte de atrás a un miembro de enumeración con un elenco simple y luego llamar a ToString():

int value = GetValueFromDb();
var enumDisplayStatus = (EnumDisplayStatus)value;
string stringValue = enumDisplayStatus.ToString();

13
Actualización: solo ciertas sobrecargas que usan IFormatProvider están en desuso. ToString () está bien. Ver groups.google.com/group/DotNetDevelopment/browse_thread/thread/…
AndyM

¿Cuál es el comportamiento en caso de enum Foo { A = 1, B= 1 }?
dbkk

3
@dbkk, la documentación indica que con respecto a las enumeraciones "su código no debe hacer ninguna suposición sobre qué cadena se devolverá". debido a la situación precisa que cita. ver msdn.microsoft.com/en-us/library/16c1xs4z.aspx
Paul D'Ambra el

44
Una solución actualizada: msdn.microsoft.com/en-us/library/…
Jack

44
más corto: var stringValue = ((EnumDisplayStatus) value) .ToString ()
redwards510

188

Si necesita obtener una cadena "Visible"sin obtener EnumDisplayStatusinstancia, puede hacer esto:

int dbValue = GetDBValue();
string stringValue = Enum.GetName(typeof(EnumDisplayStatus), dbValue);

55
Si te parece la respuesta de Mandoleen, hay una inexactitud: Enum.GetName devuelve una cadena, no una Enum
Algreat

¿Utiliza esto la reflexión o el compilador crea un diccionario auxiliar para usar detrás de escena?
palswim

155

Prueba esto:

string m = Enum.GetName(typeof(MyEnumClass), value);

@nilco esta respuesta es buena, pero prefiero la respuesta de Kents, principalmente porque tengo un atributo personalizado en mis enumeraciones "Descripción" Luego tengo una extensión de enumeración para obtener la descripción, esto es para mostrarlo en la pantalla para el usuario.
Harag

60

Utilizar este:

string bob = nameof(EnumDisplayStatus.Visible);

99
Sin embargo, se requiere C # 6+.
Adam K Dean

10
@AZChad es una gran cosa saber, seguro; pero en realidad no se aplica en el escenario del OP, ya que los valores provienen de una base de datos (entonces: tiempo de ejecución, no tiempo de compilación, valores)
Marc Gravell

22

puedes lanzarlo

int dbValue = 2;
EnumDisplayStatus enumValue = (EnumDisplayStatus)dbValue;
string stringName = enumValue.ToString(); //Visible

ah .. kent me ganó :)


Ahora Kent obtiene todo el representante de "primera respuesta". ¡Buen Kent! : p
Matt Kocaj

12

DB a C #

EnumDisplayStatus status = (EnumDisplayStatus)int.Parse(GetValueFromDb());

C # a DB

string dbStatus = ((int)status).ToString();

12

SOLUCIÓN:

int enumValue = 2; // The value for which you want to get string 
string enumName = Enum.GetName(typeof(EnumDisplayStatus), enumValue);

Además, usar GetName es mejor que la conversión explícita de Enum .

[Código de referencia de rendimiento]

Stopwatch sw = new Stopwatch (); sw.Start (); sw.Stop (); sw.Reset ();
double sum = 0;
int n = 1000;
Console.WriteLine ("\nGetName method way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = Enum.GetName (typeof (Roles), roleValue);
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Getname method casting way: {sum / n}");
Console.WriteLine ("\nExplicit casting way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = ((Roles)roleValue).ToString ();
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Explicit casting way: {sum / n}");

[Resultado de la muestra]

GetName method way:
Average of 1000 runs using Getname method casting way: 0.000186899999999998
Explicit casting way:
Average of 1000 runs using Explicit casting way: 0.000627900000000002

2
Esta es una copia de una respuesta de 7 años. ¿Puedes explicar por qué el tuyo es mejor que el original?
nvoigt

@nvoigt Porque, si estoy en lo correcto, la API ToString () en Enum ahora está obsoleta. [ docs.microsoft.com/en-us/dotnet/api/…
Naveen Kumar V

Entonces ... al menos otras dos respuestas ya proporcionan el código que publicaste. ¿Qué proporciona la tuya sobre la de Mandoleen o algreat?
nvoigt

@nvoigt No mencionaron su rendimiento en comparación con el casting explícito. ¿Es esto suficiente para que te guste mi respuesta? : p Gracias de todos modos, espero que ayude a alguien. :)
Naveen Kumar V

Parece que tenemos un problema de comunicación. ¿Estás en un dispositivo móvil o tal vez no te desplazaste lo suficiente? Hay dos copias exactas de su respuesta de hace 7 años. Llamé a los respondedores, por lo que deberían ser fáciles de encontrar. ¿Qué proporciona su respuesta que no ha estado aquí por al menos 7 años?
nvoigt

9

La solución de tiempo de compilación más rápida usando nameof expresión .

Devuelve el literal de la enumeración.

public enum MyEnum {
    CSV,
    Excel
}


string enumAsString = nameof(MyEnum.CSV)
// enumAsString = "CSV"

Nota:

  • No querrá nombrar una enumeración en mayúscula completa, pero solía demostrar la sensibilidad a mayúsculas y minúsculas de nameof.

Esto debería haber sido una respuesta.
Fan de LinPy

@LinPyfan ¡Me alegra que funcione bien! Esta es una fecha relativamente nueva en comparación con la fecha de OP.
Coseche

4

Solo necesito:

string stringName = EnumDisplayStatus.Visible.ToString("f");
// stringName == "Visible"

1
en la mayoría de los casos, esto es prácticamente idéntico a la respuesta principal de hace 10 años; la adición del "f"especificador está matizada, y puede o no ser lo que quiere la persona que llama (depende de: lo que quiera): docs.microsoft.com/en-us/dotnet/standard/base-types/…
Marc Gravell

No le presté atención a la cita ajá. Creo que es bueno actualizar un poco la solución anterior como esta. No seré el último en abrir esta página. Y gracias por tu precisión! :)
Al3x_M

3

Para obtener el valor de cadena [Nombre]:

EnumDisplayStatus enumDisplayStatus = (EnumDisplayStatus)GetDBValue();
string stringValue = $"{enumDisplayStatus:G}"; 

Y para obtener el valor enum:

string stringValue = $"{enumDisplayStatus:D}";
SetDBValue(Convert.ToInt32(stringValue ));

¿Por qué no solo .ToString ()? 'facepalm'
MeTitus

3

He usado este código dado a continuación

 CustomerType = ((EnumCustomerType)(cus.CustomerType)).ToString()

1

Simplemente envíe el int al tipo de enumeración:

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.