Enum String Name from Value

407

Ich habe ein Enum-Konstrukt wie dieses:

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

In meiner Datenbank werden die Aufzählungen nach Wert referenziert. Meine Frage ist, wie ich die Zahlendarstellung der Aufzählung wieder auf den Zeichenfolgennamen zurücksetzen kann.

Zum Beispiel sollte 2das Ergebnis gegeben sein Visible.

jdee
quelle
25
Ich glaube, jetzt gibt es einen einfacheren Weg, dies mit VS 2015 zu tun. Ich nameof(EnumDisplayStatus.Visible)hoffe, es hilft jemandem
Gabriel Marius Popescu

Antworten:

541

Sie können die intRückseite mit einer einfachen Besetzung in ein Aufzählungselement konvertieren und dann Folgendes aufrufen ToString():

int value = GetValueFromDb();
var enumDisplayStatus = (EnumDisplayStatus)value;
string stringValue = enumDisplayStatus.ToString();
Kent Boogaart
quelle
13
Update: Nur bestimmte Überladungen mit IFormatProvider sind veraltet. ToString () ist in Ordnung. Siehe groups.google.com/group/DotNetDevelopment/browse_thread/thread/…
AndyM
Wie ist das Verhalten bei enum Foo { A = 1, B= 1 }?
dbkk
3
@dbkk In der Dokumentation heißt es, dass in Bezug auf Aufzählungen "Ihr Code keine Annahmen darüber treffen sollte, welche Zeichenfolge zurückgegeben wird". wegen der genauen Situation, die Sie zitieren. siehe msdn.microsoft.com/en-us/library/16c1xs4z.aspx
Paul D'Ambra
4
Eine aktualisierte Lösung: msdn.microsoft.com/en-us/library/…
Jack
4
kürzer: var stringValue = ((EnumDisplayStatus) Wert) .ToString ()
redwards510
187

Wenn Sie eine Zeichenfolge "Visible"abrufen müssen, ohne eine EnumDisplayStatusInstanz abzurufen, können Sie Folgendes tun:

int dbValue = GetDBValue();
string stringValue = Enum.GetName(typeof(EnumDisplayStatus), dbValue);
algreat
quelle
5
Wenn Sie über Mandoleens Antwort sprechen, gibt es eine Ungenauigkeit: Enum.GetName gibt eine Zeichenfolge zurück, keine Enum
algreat
Verwendet dies Reflektion oder erstellt der Compiler ein Hilfswörterbuch für die Verwendung hinter den Kulissen?
Palswim
155

Versuche dies:

string m = Enum.GetName(typeof(MyEnumClass), value);
Mandoleen
quelle
@nilco Diese Antwort ist gut, aber ich bevorzuge die Antwort von Kents, hauptsächlich weil ich ein benutzerdefiniertes Attribut in meinen Aufzählungen habe. "Beschreibung" Ich habe dann eine Aufzählungserweiterung, um die Beschreibung zu erhalten - dies dient zur Anzeige auf dem Bildschirm für den Benutzer.
Harag
60

Benutze das:

string bob = nameof(EnumDisplayStatus.Visible);
James Cooke
quelle
9
C # 6+ erforderlich.
Adam K Dean
10
@AZChad es ist eine großartige Sache zu wissen, sicher; Im OP-Szenario trifft dies jedoch nicht wirklich zu, da die Werte aus einer Datenbank stammen (also: Laufzeit, keine Kompilierungszeit, Werte)
Marc Gravell
22

du kannst es einfach besetzen

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

ah .. kent hat mich geschlagen :)

Hath
quelle
Jetzt bekommt Kent alle "ersten Antworten". Netter Kent! : p
Matt Kocaj
12

DB zu C #

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

C # zu DB

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

quelle
12

LÖSUNG:

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

Außerdem ist die Verwendung von GetName besser als das explizite Casting von Enum .

[Code für Leistungsbenchmark]

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

[Beispielergebnis]

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.
quelle
2
Dies ist eine Kopie einer 7 Jahre alten Antwort. Können Sie erklären, warum Ihre besser ist als das Original?
nvoigt
@nvoigt Weil, wenn ich richtig bin, die ToString () - API in Enum jetzt veraltet ist. [ docs.microsoft.com/en-us/dotnet/api/…
Naveen Kumar V
Also ... mindestens zwei andere Antworten liefern bereits den Code, den Sie gepostet haben. Was bieten Sie gegenüber Mandoleen oder Algreat?
nvoigt
@nvoigt Sie haben nicht über seine Leistung im Vergleich zu Explicit Casting erwähnt. Reicht das aus, um meine Antwort zu mögen? : p Trotzdem danke, ich hoffe es wird jemandem helfen. :)
Naveen Kumar V
Wir scheinen ein Kommunikationsproblem zu haben. Sind Sie auf einem mobilen Gerät oder haben Sie nicht weit genug nach unten gescrollt? Es gibt zwei exakte Kopien Ihrer Antwort von vor 7 Jahren. Ich habe die Antwortenden benannt, damit sie leicht zu finden sind. Was liefert Ihre Antwort, die seit mindestens 7 Jahren nicht mehr hier ist?
nvoigt
9

Die schnellste Lösung zur Kompilierungszeit mit nameof Ausdruck .

Gibt das Literal der Aufzählung zurück.

public enum MyEnum {
    CSV,
    Excel
}


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

Hinweis:

  • Sie möchten eine Aufzählung nicht in Großbuchstaben benennen, sondern verwenden, um die Groß- und Kleinschreibung von zu demonstrieren nameof.
Ernten
quelle
Dies hätte eine Antwort sein sollen.
LinPy-Fan
@ LinPyfan Schön, dass es gut funktioniert! Dies ist im Vergleich zum OP-Datum relativ neu.
Ernten Sie
4

Brauche nur:

string stringName = EnumDisplayStatus.Visible.ToString("f");
// stringName == "Visible"
Al3x_M
quelle
1
In den meisten Fällen ist dies ziemlich identisch mit der Top-Antwort von vor 10 Jahren; Das Hinzufügen des "f"Bezeichners ist nuanciert und kann oder kann nicht das sein, was der Anrufer will (es hängt davon ab, was er will): docs.microsoft.com/en-us/dotnet/standard/base-types/…
Marc Gravell
Ich habe nicht auf das Datum geachtet, ahah. Ich denke, es ist gut, die alte Lösung wie diese ein bisschen zu aktualisieren. Ich werde nicht der letzte sein, der diese Seite öffnet. Und danke für deine Präzision! :)
Al3x_M
3

So erhalten Sie den String-Wert [Name]:

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

Und um den Enum-Wert zu erhalten:

string stringValue = $"{enumDisplayStatus:D}";
SetDBValue(Convert.ToInt32(stringValue ));
Muhammad Aqib
quelle
Warum nicht einfach .ToString ()? 'facepalm'
MeTitus
3

Ich habe diesen Code unten verwendet

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

Verwandeln Sie das int einfach in den Aufzählungstyp:

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