Ich habe eine Aufzählung von zum Beispiel ' Gender
' ( Male =0 , Female =1
) und ich habe eine andere Aufzählung von einem Dienst, der eine eigene Gender-Aufzählung hat ( Male =0 , Female =1, Unknown =2
)
Meine Frage ist, wie kann ich etwas schnelles und schönes schreiben, um es von ihrer Aufzählung in meine umzuwandeln?
Antworten:
Die Verwendung einer Erweiterungsmethode funktioniert recht gut, wenn Sie die beiden von Nate vorgeschlagenen Konvertierungsmethoden verwenden:
Offensichtlich müssen Sie keine separaten Klassen verwenden, wenn Sie dies nicht möchten. Ich bevorzuge es, Erweiterungsmethoden nach den Klassen / Strukturen / Aufzählungen zu gruppieren, für die sie gelten.
quelle
Gegeben
Enum1 value = ...
, wenn Sie mit Namen meinen:Wenn Sie mit numerischem Wert meinen, können Sie normalerweise nur Folgendes umwandeln:
(Mit der Besetzung möchten Sie möglicherweise nach
Enum.IsDefined
gültigen Werten suchen.)quelle
Enum.Tryparse
: AufEnum2 value2 = Enum.TryParse(value.ToString(), out Enum2 outValue) ? outValue : Enum2.Unknown;
diese Weise können Sie Eingabewerte verarbeiten, die nicht vorhanden sind,Enum2
ohne dass Sie aufgerufene s aufrufenEnum.IsDefined
oder abfangen müssen . Beachten Sie, dass die Reihenfolge der Parameter mehr oder weniger umgekehrt ist .ArgumentException
Enum.Parse
Enum.Parse
Wandeln Sie einfach eine in int und dann in die andere Aufzählung um (vorausgesetzt, Sie möchten, dass die Zuordnung basierend auf dem Wert erfolgt):
quelle
long
(oderulong
) und nicht durch ein Element unterstützt wird,int
dessen Mitglieder überint.MaxValue
(oder unter) definiert sindint.MinValue
), in diesem Fall könnte die Umwandlung inint
überlaufen und Sie würden einen undefinierten Aufzählungswert erhalten, der definiert werden sollte.Um genau zu sein, erstelle ich normalerweise ein Funktionspaar, eine, die Enum 1 verwendet und Enum 2 zurückgibt, und eine, die Enum 2 verwendet und Enum 1 zurückgibt. Jede besteht aus einer case-Anweisung, die Eingaben den Ausgaben zuordnet, und der Standardfall löst eine Ausnahme mit a aus Nachricht, die sich über einen unerwarteten Wert beschwert.
In diesem speziellen Fall könnten Sie die Tatsache ausnutzen, dass die ganzzahligen Werte von männlich und weiblich gleich sind, aber ich würde dies vermeiden, da es hackisch ist und zu Brüchen führen kann, wenn sich eine der Aufzählungen in Zukunft ändert.
quelle
Wenn wir haben:
und
Wir können sicher tun
Oder auch
Wenn Sie den Fall behandeln möchten, in dem eine Aufzählung auf der rechten Seite des '=' - Zeichens mehr Werte enthält als die Aufzählung auf der linken Seite, müssen Sie Ihre eigene Methode / Ihr eigenes Wörterbuch schreiben, um dies zu behandeln, wie von anderen vorgeschlagen.
quelle
Sie könnten eine einfache generische Erweiterungsmethode wie diese schreiben
quelle
Sie könnten eine einfache Funktion wie die folgende schreiben:
quelle
Hier ist eine Version der Erweiterungsmethode, wenn jemand interessiert ist
quelle
quelle
Ich habe vor einiger Zeit eine Reihe von Erweiterungsmethoden geschrieben, die für verschiedene Arten von
Enum
s funktionieren . Eines funktioniert insbesondere für das, was Sie erreichen möchten, und behandeltEnum
s mit demFlagsAttribute
sowieEnum
s mit verschiedenen zugrunde liegenden Typen.Von dort aus können Sie weitere spezifischere Erweiterungsmethoden hinzufügen.
Dieser ändert die Arten von
Enum
s, wie Sie es versuchen.Seien Sie jedoch gewarnt, dass Sie mit dieser Methode zwischen allen
Enum
anderen konvertieren könnenEnum
, auch wenn diese keine Flags haben. Beispielsweise:Die Variable
turtle
hat einen Wert vonTurtle.Blue
.Bei
Enum
dieser Methode besteht jedoch Sicherheit vor undefinierten Werten. Zum Beispiel:In diesem Fall
access
wird auf gesetztWriteAccess.ReadWrite
, da dieWriteAccess
Enum
einen Maximalwert von 3 hat.Ein weiterer Nebeneffekt beim Mischen von
Enum
s mitFlagsAttribute
und ohne ist, dass der Umwandlungsprozess nicht zu einer 1: 1-Übereinstimmung zwischen ihren Werten führt.In diesem Fall
letters
hat er einen Wert vonLetters.H
stattLetters.D
, da der Hintergrundwert vonFlavors.Peach
8 ist. Außerdem würde eine Konvertierung vonFlavors.Cherry | Flavors.Grape
nachLetters
ergebenLetters.C
, was unintuitiv erscheinen kann.quelle
Basierend auf Justins Antwort oben habe ich Folgendes gefunden:
quelle
Ich weiß, dass dies eine alte Frage ist und habe viele Antworten. Ich finde jedoch, dass die Verwendung einer switch-Anweisung wie in der akzeptierten Antwort etwas umständlich ist. Hier sind meine 2 Cent:
Meine persönliche Lieblingsmethode ist die Verwendung eines Wörterbuchs, bei dem der Schlüssel die Quellaufzählung und der Wert die Zielaufzählung ist. In dem auf die Frage gestellten Fall würde mein Code also folgendermaßen aussehen:
Dies kann natürlich in eine statische Klasse eingeschlossen und als Erweiterungsmethode verwendet werden:
quelle
Sie können ToString () verwenden, um die erste Aufzählung in ihren Namen zu konvertieren, und dann Enum.Parse (), um die Zeichenfolge zurück in die andere Aufzählung zu konvertieren. Dies löst eine Ausnahme aus, wenn der Wert von der Zielaufzählung nicht unterstützt wird (dh für einen "unbekannten" Wert).
quelle