Wie kann ein int
in ein enum
C # umgewandelt werden?
3189
Aus einer Zeichenfolge:
YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString);
// The foo.ToString().Contains(",") check is necessary for enumerations marked with an [Flags] attribute
if (!Enum.IsDefined(typeof(YourEnum), foo) && !foo.ToString().Contains(","))
{
throw new InvalidOperationException($"{yourString} is not an underlying value of the YourEnum enumeration.")
}
Aus einem int:
YourEnum foo = (YourEnum)yourInt;
Aktualisieren:
Von Nummer können Sie auch
YourEnum foo = (YourEnum)Enum.ToObject(typeof(YourEnum) , yourInt);
YourEnum
ist , wenn es dynamisch ist und nur zur Laufzeit bekannt ist, und was ich konvertieren möchteEnum
?var result = Enum.TryParse(yourString, out yourEnum)
heutzutage wirklich verwenden (und das Ergebnis überprüfen, um festzustellen, ob die Konvertierung fehlgeschlagen ist).Enum.Parse
Groß- und Kleinschreibung nicht zutrue
berücksichtigen, indem dem Aufruf ein Parameterwert hinzugefügt wird :YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString, true);
Wirf es einfach:
Sie können mit Enum.IsDefined überprüfen, ob es sich in Reichweite befindet :
quelle
Enum.IsDefined
, beachten Sie, dass es gefährlich sein kann: msdn.microsoft.com/en-us/library/ms229025(VS.90).aspxIsDefined
Sie Eingabewerte überprüfen, sind Sie im Grunde anfällig für Personen, die später neue Aufzählungswerte hinzufügen, die eineIsDefined
Prüfung bestehen würden (seit dem neuen Wert ist im neuen Code vorhanden), funktioniert jedoch möglicherweise nicht mit dem ursprünglichen Code, den Sie geschrieben haben. Es ist daher sicherer, die Aufzählungswerte, die Ihr Code verarbeiten kann, explizit anzugeben.Alternativ können Sie eine Erweiterungsmethode anstelle eines Einzeilers verwenden:
Verwendungszweck:
ODER
quelle
System.String
scheint eine Verschmutzung des Namespaces zu seinIch denke, um eine vollständige Antwort zu erhalten, müssen die Leute wissen, wie Aufzählungen intern in .NET funktionieren.
Wie Dinge funktionieren
Eine Aufzählung in .NET ist eine Struktur, die eine Reihe von Werten (Feldern) einem Basistyp zuordnet (Standard ist
int
). Sie können jedoch tatsächlich den Integraltyp auswählen, dem Ihre Aufzählung zugeordnet ist:In diesem Fall wird die Aufzählung dem
short
Datentyp zugeordnet. Dies bedeutet, dass sie als Short im Speicher gespeichert wird und sich beim Casting und Verwenden als Short verhält.Wenn Sie es aus IL-Sicht betrachten, sieht eine (normale, int) Aufzählung folgendermaßen aus:
Was Ihre Aufmerksamkeit hier erregen sollte, ist, dass das
value__
getrennt von den Aufzählungswerten gespeichert wird. Im Fall derFoo
obigen Aufzählung ist der Typ vonvalue__
int16. Dies bedeutet im Grunde, dass Sie alles, was Sie wollen, in einer Aufzählung speichern können, solange die Typen übereinstimmen .An dieser Stelle möchte ich darauf hinweisen, dass dies
System.Enum
ein Werttyp ist, was im Grunde bedeutet, dassBarFlag
4 Bytes im Speicher undFoo
2 Bytes belegt werden - z. B. die Größe des zugrunde liegenden Typs (es ist tatsächlich komplizierter als das, aber Hallo...).Die Antwort
Wenn Sie also eine Ganzzahl haben, die Sie einer Aufzählung zuordnen möchten, muss die Laufzeit nur zwei Dinge tun: Kopieren Sie die 4 Bytes und nennen Sie sie etwas anderes (den Namen der Aufzählung). Das Kopieren ist implizit, da die Daten als Werttyp gespeichert werden. Dies bedeutet im Grunde, dass Sie bei Verwendung von nicht verwaltetem Code einfach Aufzählungen und Ganzzahlen austauschen können, ohne Daten zu kopieren.
Aus Sicherheitsgründen ist es meiner Meinung nach eine bewährte Methode, zu wissen, dass die zugrunde liegenden Typen identisch oder implizit konvertierbar sind, und sicherzustellen, dass die Aufzählungswerte vorhanden sind (sie werden nicht standardmäßig überprüft!).
Versuchen Sie den folgenden Code, um zu sehen, wie dies funktioniert:
Beachten Sie, dass das Casting
e2
auch funktioniert! Aus der obigen Compiler-Perspektive ist dies sinnvoll: Dasvalue__
Feld wird einfach mit 5 oder 6 gefüllt, und beiConsole.WriteLine
AufrufenToString()
wird der Name vone1
aufgelöst, der Name vone2
nicht.Wenn dies nicht beabsichtigt ist
Enum.IsDefined(typeof(MyEnum), 6)
, überprüfen Sie mit, ob der Wert, den Sie übertragen, einer definierten Aufzählung zugeordnet ist.Beachten Sie auch, dass ich den zugrunde liegenden Typ der Aufzählung explizit wiedergebe, obwohl der Compiler dies tatsächlich überprüft. Ich mache das, um sicherzustellen, dass ich später keine Überraschungen erleide. Um diese Überraschungen in Aktion zu sehen, können Sie den folgenden Code verwenden (tatsächlich habe ich gesehen, dass dies im Datenbankcode häufig vorkommt):
quelle
int
! =short
, Wird es werfen (Unboxing schlägt fehl). Wenn Sie dies tunobject o = (short)5;
, wird es funktionieren, da dann die Typen übereinstimmen. Es geht nicht um die Reichweite, es geht wirklich um den Typ.Nehmen Sie das folgende Beispiel:
quelle
Ich verwende diesen Code, um int in meine Aufzählung umzuwandeln:
Ich finde es die beste Lösung.
quelle
Unten finden Sie eine nette Utility-Klasse für Enums
quelle
Bei numerischen Werten ist dies sicherer, da ein Objekt zurückgegeben wird, egal was passiert:
quelle
Wenn Sie für 4.0 .NET Framework bereit sind , gibt es eine neue Enum.TryParse () -Funktion, die sehr nützlich ist und gut mit dem Attribut [Flags] funktioniert. Siehe Enum.TryParse-Methode (String, TEnum%)
quelle
Wenn Sie eine Ganzzahl haben, die als Bitmaske fungiert und einen oder mehrere Werte in einer [Flags] -Aufzählung darstellen könnte, können Sie diesen Code verwenden, um die einzelnen Flag-Werte in einer Liste zu analysieren:
Beachten Sie, dass dies voraussetzt, dass der zugrunde liegende Typ von
enum
eine vorzeichenbehaftete 32-Bit-Ganzzahl ist. Wenn es sich um einen anderen numerischen Typ handeln würde, müssten Sie den fest codierten 32 ändern, um die Bits in diesem Typ wiederzugeben (oder ihn programmgesteuert mit ableitenEnum.GetUnderlyingType()
).quelle
Manchmal haben Sie ein Objekt für den
MyEnum
Typ. MögenDann:
quelle
Dies ist eine sichere Konvertierungsmethode für die Aufzählung von Flags:
quelle
Enum
statt beschränkt wirdstruct
, was bedeutet, dass wir uns nicht auf die Laufzeitprüfung verlassen müssen!Um einen String in die Konstante ENUM oder int in die Konstante ENUM zu konvertieren, müssen wir die Funktion Enum.Parse verwenden. Hier ist ein Youtube-Video https://www.youtube.com/watch?v=4nhx4VwdRDk das tatsächlich mit String demonstriert und dasselbe gilt für int.
Der Code lautet wie folgt: "Rot" ist die Zeichenfolge und "MyColors" ist die Farbe ENUM mit den Farbkonstanten.
quelle
Etwas abseits der ursprünglichen Frage, aber ich fand eine Antwort auf die Frage " Stapelüberlauf" . Erstellen Sie eine statische Klasse mit
public const int
Eigenschaften, damit Sie auf einfache Weise eine Reihe verwandterint
Konstanten zusammenfassen können, ohne sieint
bei der Verwendung umwandeln zu müssen.Natürlich geht ein Teil der Funktionalität des Aufzählungstyps verloren, aber zum Speichern einer Reihe von Datenbank-ID-Konstanten scheint dies eine ziemlich ordentliche Lösung zu sein.
quelle
Dadurch werden Ganzzahlen oder Zeichenfolgen in einer Zielaufzählung mit teilweiser Übereinstimmung in dot.NET 4.0 unter Verwendung von Generika wie in der obigen Dienstprogrammklasse von Tawani analysiert. Ich verwende es, um Befehlszeilen-Switch-Variablen zu konvertieren, die möglicherweise unvollständig sind. Da eine Aufzählung nicht null sein kann, sollten Sie logisch einen Standardwert angeben. Es kann so genannt werden:
Hier ist der Code:
Zu Ihrer Information : Die Frage betraf Ganzzahlen, die niemand erwähnt hat und die auch explizit in Enum.TryParse () konvertiert werden.
quelle
Aus einer Zeichenfolge: (Enum.Parse ist veraltet, verwenden Sie Enum.TryParse)
quelle
Das Folgende ist eine etwas bessere Erweiterungsmethode
quelle
In meinem Fall musste ich die Aufzählung von einem WCF-Dienst zurückgeben. Ich brauchte auch einen freundlichen Namen, nicht nur die Aufzählung.ToString ().
Hier ist meine WCF-Klasse.
Hier ist die Erweiterungsmethode, die die Beschreibung aus der Aufzählung erhält.
Implementierung:
quelle
Ich weiß nicht mehr, woher ich den Teil dieser Enum-Erweiterung bekomme, aber er stammt von stackoverflow. Das tut mir leid! Aber ich habe dieses genommen und es für Enums mit Flags modifiziert. Für Enums mit Flags habe ich folgendes gemacht:
Beispiel:
quelle
Sie sollten eine Art passende Entspannung einbauen, um robuster zu sein.
Testfall
quelle
Verschiedene Möglichkeiten zum und vom Casting
Enum
quelle
Es kann Ihnen helfen, alle Eingabedaten in die vom Benutzer gewünschte Aufzählung zu konvertieren . Angenommen, Sie haben eine Aufzählung wie die folgende, die standardmäßig int ist . Bitte fügen Sie zuerst in Ihrer Aufzählung einen Standardwert hinzu . Dies wird bei Helfern verwendet, wenn keine Übereinstimmung mit dem Eingabewert gefunden wird.
NB: Hier versuche ich Wert in int zu analysieren, weil Enum ist standardmäßig int Wenn Sie Aufzählungs wie diese definieren, ist Byte - Typ.
Sie müssen das Parsen bei der Hilfsmethode von ändern
zu
byte.TryParse(value.ToString(), out tempType)
Ich überprüfe meine Methode auf folgende Eingaben
Entschuldigung für mein Englisch
quelle
Hier ist eine Erweiterungsmethode,
Int32
die umgewandelt wirdEnum
.Bitweise Flags werden auch dann berücksichtigt, wenn der Wert höher als das maximal mögliche ist. Wenn Sie beispielsweise eine Aufzählung mit den Möglichkeiten 1 , 2 und 4 haben , das int jedoch 9 ist , wird dies als 1 in Abwesenheit einer 8 verstanden . Auf diese Weise können Sie Datenaktualisierungen vor Codeaktualisierungen vornehmen.
quelle
die einfache und übersichtliche Möglichkeit, ein int in c # in enum umzuwandeln:
quelle
Sie verwenden einfach die explizite Konvertierung. Cast int to enum oder enum to int
quelle
quelle
Du magst einfach unten:
So stellen Sie sicher, dass Sie nur die richtigen Werte umwandeln und ansonsten eine Ausnahme auslösen können:
Beachten Sie, dass die Verwendung von IsDefined kostspielig ist und sogar mehr als nur das Casting. Daher hängt es von Ihrer Implementierung ab, ob Sie IsDefined verwenden oder nicht.
quelle
Sie können die Erweiterungsmethode verwenden.
Verwenden Sie wie unten Code
Aufzählung:
Verwendungszweck :
quelle