Ich habe kürzlich die Verwendung von Enums in meinem Code zugunsten von Klassen mit geschützten Konstruktoren und vordefinierten statischen Instanzen aufgegeben (dank Roelof - C# Sicherstellen gültiger Enum-Werte - Zukunftssichere Methode ).
In Anbetracht dessen würde ich jetzt wie folgt vorgehen (einschließlich der impliziten Umwandlung in/aus int
).
public class Question
{
// Attributes
protected int index;
protected string name;
// Go with a dictionary to enforce unique index
//protected static readonly ICollection<Question> values = new Collection<Question>();
protected static readonly IDictionary<int,Question> values = new Dictionary<int,Question>();
// Define the "enum" values
public static readonly Question Role = new Question(2,"Role");
public static readonly Question ProjectFunding = new Question(3, "Project Funding");
public static readonly Question TotalEmployee = new Question(4, "Total Employee");
public static readonly Question NumberOfServers = new Question(5, "Number of Servers");
public static readonly Question TopBusinessConcern = new Question(6, "Top Business Concern");
// Constructors
protected Question(int index, string name)
{
this.index = index;
this.name = name;
values.Add(index, this);
}
// Easy int conversion
public static implicit operator int(Question question) =>
question.index; //nb: if question is null this will return a null pointer exception
public static implicit operator Question(int index) =>
values.TryGetValue(index, out var question) ? question : null;
// Easy string conversion (also update ToString for the same effect)
public override string ToString() =>
this.name;
public static implicit operator string(Question question) =>
question?.ToString();
public static implicit operator Question(string name) =>
name == null ? null : values.Values.FirstOrDefault(item => name.Equals(item.name, StringComparison.CurrentCultureIgnoreCase));
// If you specifically want a Get(int x) function (though not required given the implicit converstion)
public Question Get(int foo) =>
foo; //(implicit conversion will take care of the conversion for you)
}
Der Vorteil dieses Ansatzes ist, dass Sie alles bekommen, was Sie von der Enum haben, aber Ihr Code ist jetzt viel flexibler, so dass, wenn Sie verschiedene Aktionen auf der Grundlage des Wertes von durchführen müssen Question
können Sie die Logik in Question
selbst (d.h. in der bevorzugten OO-Methode), im Gegensatz zu einer Vielzahl von Case-Anweisungen in Ihrem Code, um jedes Szenario zu bewältigen.
NB: Die Antwort wurde am 27.04.2018 aktualisiert, um die Funktionen von C# 6 zu nutzen, d. h. Deklarationsausdrücke und Lambda-Ausdruckskörperdefinitionen. Siehe Revisionsgeschichte für den ursprünglichen Code. Dies hat den Vorteil, dass die Definition etwas weniger ausführlich ausfällt, was einer der Hauptkritikpunkte am Ansatz dieser Antwort war.
47 Stimmen
Für den umgekehrten Fall: guss-im-scharfen-um .
16 Stimmen
Ich weiß, dass ich zu spät dran bin, aber anstatt Ihre Methode wie folgt zu definieren
get(int foo)
können Sie sie definieren alsget(Question foo)
dann führen Sie das Casting innerhalb der Methode durch, dann können Sie Ihre Methode alsQuestions.Get(Question.Role)
1 Stimmen
Versuchen Sie dies: int int_Choose = (int) Question.Role;