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.

jdee
fuente
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();
Kent Boogaart
fuente
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);
algreat
fuente
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);
Mandoleen
fuente
@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);
James Cooke
fuente
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ó :)

Hath
fuente
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();

fuente
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
Naveen Kumar V
fuente
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.
Recoger
fuente
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"
Al3x_M
fuente
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 ));
Muhammad Aqib
fuente
¿Por qué no solo .ToString ()? 'facepalm'
MeTitus
3

He usado este código dado a continuación

 CustomerType = ((EnumCustomerType)(cus.CustomerType)).ToString()
Biddut
fuente
1

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

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
lacop
fuente