Ich habe eine Klasse namens Questions
(Plural). In dieser Klasse gibt es eine Aufzählung namens Question
(Singular), die so aussieht.
public enum Question
{
Role = 2,
ProjectFunding = 3,
TotalEmployee = 4,
NumberOfServers = 5,
TopBusinessConcern = 6
}
In der Questions
Klasse habe ich eine get(int foo)
Funktion, die ein Questions
Objekt dafür zurückgibt foo
. Gibt es eine einfache Möglichkeit, den ganzzahligen Wert aus der Aufzählung zu entfernen, damit ich so etwas tun kann Questions.Get(Question.Role)
?
get(int foo)
Sie sie definieren können, undget(Question foo)
dann Ihr Casting innerhalb der Methode durchzuführen, können Sie Ihre Methode alsQuestions.Get(Question.Role)
Antworten:
Wirf einfach die Aufzählung, z
Das Obige funktioniert für die überwiegende Mehrheit der Aufzählungen, die Sie in freier Wildbahn sehen, da der zugrunde liegende Standardtyp für eine Aufzählung lautet
int
.Wie Cecilphillip jedoch betont, können Aufzählungen unterschiedliche zugrunde liegende Typen haben. Wenn eine Aufzählung als , oder deklariert
uint
istlong
,ulong
sollte sie in den Typ der Aufzählung umgewandelt werden. zB fürdu solltest benutzen
quelle
enum Test { Item = 1 }
und sehen, dass1 == (int)Test.Item
das gleich ist.(int)Test.Item
Das ist eine Besetzung! () ist der explizite Cast-Operator.enum Question
nicht war,int
aberlong
diese Umwandlung denRole
Integralwert abschneidet !Enum
als Parameter akzeptieren , wissen Sie, dass Sie nur eine feste Anzahl möglicher Integralwerte erhalten können. Wenn Sie dagegen einfach eine nehmenint
, müssen Sie überprüfen, ob dieseint
innerhalb der akzeptierten Werte liegt, was den Code kompliziert. Sie können Ihre Signaturen jederzeit überschreiben, z. B. `` `public void MyMethod (int x) {// etwas mit x tun} public void MyMethod (Enum x) {this.MyMethod ((int) x); } `` ``Da Aufzählungen jeder integraler Typ sein können (
byte
,int
,short
, usw.), eine robustere Art und Weise den zugrunde liegenden Integralwert des Enum zu bekommen wäre die Verwendung der machenGetTypeCode
Methode in Verbindung mit derConvert
Klasse:Dies sollte unabhängig vom zugrunde liegenden Integraltyp funktionieren.
quelle
var
es vom Typ istobject
, also müssen Sie es entpacken und es wird unordentlicher als ich es gerne hätte.object val = Convert...etc
dievar
in Ihrem Beispiel werden es immer seinobject
.Deklarieren Sie es als statische Klasse mit öffentlichen Konstanten:
Und dann können Sie darauf verweisen
Question.Role
, und es wird immer zu einemint
oder was auch immer Sie es definieren ausgewertet .quelle
static readonly int
weil Konstanten in ihre harten Werte kompiliert werden. Siehe stackoverflow.com/a/755693/492const
und nicht,static readonly
weil Sie bei jedem Vergleichstatic readonly
einen Methodenaufruf durchführen, um den Wert der Variablen abzurufen , während Sie mit aconst
zwei Werttypen direkt vergleichen.compilation limitation
meine ich, dass der Wert beim Kompilieren fest codiert ist, sodass für jede Änderung dieses Werts alle Assemblys, die ihn verwenden, neu kompiliert werden müssen. Ich bin geneigt, Ihnen in Bezug auf die Verwendung zuzustimmen, da eine Änderung der Werte weitreichende Auswirkungen hätte.Wird dazu führen
value == 2
.quelle
In einem verwandten Hinweis, wenn Sie den
int
Wert von erhalten möchtenSystem.Enum
, danne
hier angegeben:Sie können verwenden:
Die letzten beiden sind einfach hässlich. Ich bevorzuge den ersten.
quelle
Es ist einfacher als Sie denken - eine Aufzählung ist bereits eine int. Es muss nur daran erinnert werden:
quelle
Beispiel:
Und im Code dahinter, um den Aufzählungswert zu erhalten:
oder
Aufzählungen werden um 1 erhöht, und Sie können den Startwert festlegen. Wenn Sie den Startwert nicht einstellen, wird er zunächst als 0 zugewiesen.
quelle
1
inint
außer Sie nicht ausdrücklich anders definiertIch habe kürzlich von der Verwendung von Aufzählungen in meinem Code auf die Verwendung von Klassen mit geschützten Konstruktoren und vordefinierten statischen Instanzen umgestellt (dank Roelof - C # Sicherstellen gültiger Aufzählungswerte - Zukunftssichere Methode ).
In Anbetracht dessen würde ich im Folgenden näher auf dieses Problem eingehen (einschließlich der impliziten Konvertierung nach / von
int
).Der Vorteil dieses Ansatzes besteht darin, dass Sie alles, was Sie hätten, aus der Aufzählung erhalten, aber Ihr Code ist jetzt viel flexibler. Sollten Sie also verschiedene Aktionen basierend auf dem Wert von ausführen müssen
Question
, können Sie Logik in sichQuestion
selbst einfügen (dh in der bevorzugten OO) Mode) im Gegensatz zu vielen case-Anweisungen in Ihrem Code, um jedes Szenario anzugehen.NB: Antwort aktualisiert am 27.04.2018, um die C # 6-Funktionen zu nutzen. dh Deklarationsausdrücke und Lambda-Ausdruckskörperdefinitionen. Siehe Revisionsverlauf für Original - Code. Dies hat den Vorteil, dass die Definition etwas weniger ausführlich ist. Dies war eine der Hauptbeschwerden über den Ansatz dieser Antwort.
quelle
Wenn Sie eine Ganzzahl für den Enum-Wert erhalten möchten, der in einer Variablen gespeichert ist, für die der Typ wäre
Question
, um ihn beispielsweise in einer Methode zu verwenden, können Sie dies einfach tun, den ich in diesem Beispiel geschrieben habe:Dadurch wird der Fenstertitel in 4 geändert, da die Variable
Geselecteerd
lautetTalen.Nederlands
. Wenn ich es in ändereTalen.Portugees
und die Methode erneut aufrufe, ändert sich der Text in 3.quelle
Um sicherzustellen, dass ein Aufzählungswert vorhanden ist, und ihn dann zu analysieren, können Sie auch Folgendes tun.
quelle
Vielleicht habe ich es verpasst, aber hat jemand eine einfache generische Erweiterungsmethode ausprobiert?
Das funktioniert gut für mich. Sie können die Typumwandlung in Ihrer API auf diese Weise vermeiden, aber letztendlich führt dies zu einer Änderungstypoperation. Dies ist ein guter Fall für die Programmierung von Roslyn , damit der Compiler eine GetValue <T> -Methode für Sie erstellt.
quelle
Noch eine Möglichkeit:
Es wird ergeben:
quelle
... ist eine schöne Erklärung.
Sie müssen das Ergebnis wie folgt in int umwandeln:
Ansonsten ist der Typ noch
QuestionType
.Diese Strenge ist der C # -Weg.
Eine Alternative besteht darin, stattdessen eine Klassendeklaration zu verwenden:
Es ist weniger elegant zu deklarieren, aber Sie müssen es nicht in Code umwandeln:
Alternativ können Sie sich mit Visual Basic wohler fühlen, das diese Art von Erwartung in vielen Bereichen erfüllt.
quelle
number
sollte den Wert haben2
.quelle
bool
*,byte
,ushort
,int
, unduint
**. Der GetHashCode für andere Typen ändert den Wert, z. B. einige Bitverschiebungen und Xors. (* 1/0, ** natürlich auf int gegossen). Aber alles in allem tun Sie dies nur, wenn es sich um Ihren eigenen privaten Code handelt.Sie können dies tun, indem Sie eine Erweiterungsmethode für Ihren definierten Aufzählungstyp implementieren :
Dies vereinfacht das Abrufen des int-Werts des aktuellen Aufzählungswerts:
oder
quelle
Verwenden Sie stattdessen eine Erweiterungsmethode:
Und die Verwendung ist etwas hübscher:
quelle
quelle
Verwenden:
Es wird dazu führen
value == 2
.Dies gilt nur, wenn die Aufzählung in eine passt
int
.quelle
int
natürlichGetHashCode
in eine passt , da eine ganze Zahl zurückgegeben wird.Da Aufzählungen mit mehreren primitiven Typen deklariert werden können, kann eine generische Erweiterungsmethode zum Umwandeln eines beliebigen Aufzählungstyps hilfreich sein.
quelle
Es folgt die Erweiterungsmethode
quelle
Mein Lieblingshack mit int oder kleineren Aufzählungen:
Für eine Aufzählung
Diese,
Ausgänge
Haftungsausschluss:
Es funktioniert nicht für lange Aufzählungen.
quelle
Die einfachste Lösung, die ich mir vorstellen kann, ist das Überladen der
Get(int)
Methode wie folgt :wo
[modifiers]
kann im Allgemeinen das gleiche sein wie für dieGet(int)
Methode. Wenn Sie dieQuestions
Klasse nicht bearbeiten können oder aus irgendeinem Grund nicht möchten, können Sie die Methode überladen, indem Sie eine Erweiterung schreiben:quelle
Das Beispiel, das ich vorschlagen möchte, "um einen 'int'-Wert aus einer Aufzählung zu erhalten", ist
Jetzt lautet die Antwort 1.
quelle
Verwenden:
quelle
Versuchen Sie dies, anstatt enum in int umzuwandeln:
quelle
In Visual Basic sollte es sein:
quelle
Ich habe mir diese Erweiterungsmethode ausgedacht, die aktuelle Sprachfunktionen enthält. Durch die Verwendung von dynamic muss ich dies nicht zu einer generischen Methode machen und den Typ angeben, der den Aufruf einfacher und konsistenter hält:
quelle