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.


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

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

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

@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);

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 :)


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

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

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.

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"

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

Warum nicht einfach .ToString ()? 'facepalm'
MeTitus

3

Ich habe diesen Code unten verwendet

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

1

Verwandeln Sie das int einfach in den Aufzählungstyp:

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.