Enum String Name from Value


407

Ho un costrutto enum come questo:

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

Nel mio database, le enumerazioni sono referenziate per valore. La mia domanda è: come posso riportare la rappresentazione numerica dell'enum al nome della stringa.

Ad esempio, dato 2il risultato dovrebbe essere Visible.


25
Credo, ora c'è un modo più semplice per farlo con VS 2015 nameof(EnumDisplayStatus.Visible)Spero che aiuti qualcuno
Gabriel Marius Popescu

Risposte:


542

È possibile convertire la parte intposteriore in un membro di enumerazione con un cast semplice, quindi chiamare ToString():

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

13
Aggiornamento: solo alcuni sovraccarichi che utilizzano IFormatProvider sono obsoleti. ToString () va bene. Vedi groups.google.com/group/DotNetDevelopment/browse_thread/thread/…
AndyM,

Qual è il comportamento in caso di enum Foo { A = 1, B= 1 }?
dbkk,

3
@dbkk la documentazione afferma che per quanto riguarda gli enum "il tuo codice non dovrebbe fare ipotesi su quale stringa verrà restituita". a causa della situazione precisa che citi. vedi msdn.microsoft.com/en-us/library/16c1xs4z.aspx
Paul D'Ambra

4
Una soluzione aggiornata: msdn.microsoft.com/en-us/library/…
Jack

4
shorter: var stringValue = (((EnumDisplayStatus) value) .ToString ()
redwards510

188

Se hai bisogno di ottenere una stringa "Visible"senza ottenere EnumDisplayStatusistanza puoi farlo:

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

5
Se si parla della risposta di Mandoleen c'è un'inesattezza: Enum.GetName restituisce una stringa, non un Enum
algreat

Questo utilizza la riflessione o il compilatore crea un dizionario di supporto da usare dietro le quinte?
palswim l'

155

Prova questo:

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

@nilco questa risposta è buona, ma preferisco la risposta di Kents, principalmente perché ho un attributo personalizzato nei miei enum "Descrizione" Ho quindi un'estensione enum per ottenere la descrizione - questo è per la visualizzazione sullo schermo per l'utente.
Harag,

60

Usa questo:

string bob = nameof(EnumDisplayStatus.Visible);

9
C # 6+ richiesto però.
Adam K Dean,

10
@AZChad è una grande cosa da sapere, certo; ma in realtà non si applica allo scenario del PO, poiché i valori provengono da un database (quindi: runtime, non tempo di compilazione, valori)
Marc Gravell

22

puoi semplicemente lanciarlo

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

ah .. kent mi ha battuto :)


Ora Kent ottiene tutto il rappresentante della "prima risposta". Bel Kent! : p
Matt Kocaj,

12

DB a C #

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

C # a DB

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

12

SOLUZIONE:

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

Inoltre, usare GetName è meglio del cast esplicito di Enum .

[Codice per Performance Benchmark]

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

[Risultato del campione]

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
Questa è una copia di una risposta di 7 anni. Puoi spiegare perché il tuo è migliore dell'originale?
nvoigt,

@nvoigt Perché, se ho ragione, l'API ToString () su Enum è ora obsoleta. [ docs.microsoft.com/en-us/dotnet/api/…
Naveen Kumar V

Quindi ... almeno altre due risposte forniscono già il codice che hai pubblicato. Cosa fornisce il tuo rispetto a quello di Mandoleen o Algreat?
nvoigt,

@nvoigt Non hanno menzionato le sue prestazioni rispetto al cast esplicito. È sufficiente che ti piaccia la mia risposta? : p Grazie comunque, spero che possa aiutare qualcuno. :)
Naveen Kumar V

Sembra che abbiamo un problema di comunicazione. Sei su un dispositivo mobile o forse non hai fatto scorrere abbastanza in basso? Esistono due copie esatte della tua risposta di 7 anni fa. Ho chiamato i risponditori, quindi dovrebbero essere facili da trovare. Cosa prevede la tua risposta che non è qui da almeno 7 anni?
nvoigt,

9

La soluzione di compilazione più veloce usando nameof espressione .

Restituisce il letterale dell'enum.

public enum MyEnum {
    CSV,
    Excel
}


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

Nota:

  • Non vorrai nominare un enum in maiuscolo, ma usato per dimostrare la distinzione tra maiuscole e minuscole nameof.

Questa avrebbe dovuto essere una risposta.
Fan di LinPy

@LinPyfan Sono contento che funzioni bene! Questo è relativamente nuovo rispetto alla data del PO.
Raccolto

4

Ho solo bisogno di:

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

1
nella maggior parte dei casi, questo è praticamente identico alla risposta migliore di 10 anni fa; l'aggiunta dello "f"specificatore è sfumata e potrebbe essere o meno ciò che vuole il chiamante (dipende da: cosa vogliono): docs.microsoft.com/en-us/dotnet/standard/base-types/…
Marc Gravell

Non ho prestato attenzione alla data ahah. Penso che sia utile aggiornare un po 'la vecchia soluzione come questa. Non sarò l'ultimo ad aprire questa pagina. E grazie per la tua precisione! :)
Al3x_M,

3

Per ottenere il valore String [Nome]:

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

E per ottenere il valore enum:

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

Perché non solo .ToString ()? 'facepalm'
MeTitus

3

ho usato questo codice indicato di seguito

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

1

Basta lanciare int sul tipo di enumerazione:

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.