2313 Stimmen

Int-Wert von enum in C# abrufen

Ich habe eine Klasse namens Questions (Plural). In dieser Klasse gibt es ein Enum namens Question (Singular), der wie folgt 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 eine Questions Objekt für dieses foo . Gibt es eine einfache Möglichkeit, den Integer-Wert aus dem Enum zu erhalten, so dass ich etwas wie dieses tun kann Questions.Get(Question.Role) ?

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 als get(Question foo) dann führen Sie das Casting innerhalb der Methode durch, dann können Sie Ihre Methode als Questions.Get(Question.Role)

1 Stimmen

Versuchen Sie dies: int int_Choose = (int) Question.Role;

62voto

Beispiel:

public enum EmpNo
{
    Raj = 1,
    Rahul,
    Priyanka
}

Und in dem Code dahinter, um den Enum-Wert zu erhalten:

int setempNo = (int)EmpNo.Raj; // This will give setempNo = 1

o

int setempNo = (int)EmpNo.Rahul; // This will give setempNo = 2

Enums werden um 1 inkrementiert, und Sie können den Startwert festlegen. Wenn Sie den Startwert nicht festlegen, wird er zunächst als 0 zugewiesen.

49voto

Michael Petrotta Punkte 58361

Es ist einfacher als Sie denken - ein enum ist bereits ein int. Es muss nur daran erinnert werden:

int y = (int)Question.Role;
Console.WriteLine(y); // Prints 2

35voto

JohnLBevan Punkte 20206

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.

23voto

Wenn Sie eine Ganzzahl für den Enum-Wert erhalten möchten, der in einer Variablen gespeichert ist, für die der Typ Question um zum Beispiel in einer Methode zu verwenden, können Sie einfach das tun, was ich in diesem Beispiel geschrieben habe:

enum Talen
{
    Engels = 1, Italiaans = 2, Portugees = 3, Nederlands = 4, Duits = 5, Dens = 6
}

Talen Geselecteerd;    

public void Form1()
{
    InitializeComponent()
    Geselecteerd = Talen.Nederlands;
}

// You can use the Enum type as a parameter, so any enumeration from any enumerator can be used as parameter
void VeranderenTitel(Enum e)
{
    this.Text = Convert.ToInt32(e).ToString();
}

Dadurch wird der Fenstertitel auf 4 geändert, da die Variable Geselecteerd es Talen.Nederlands . Wenn ich es ändere in Talen.Portugees und rufen Sie die Methode erneut auf, ändert sich der Text in 3.

20voto

SixOThree Punkte 656

Verwenden Sie stattdessen eine Erweiterungsmethode:

public static class ExtensionMethods
{
    public static int IntValue(this Enum argEnum)
    {
        return Convert.ToInt32(argEnum);
    }
}

Und die Verwendung ist etwas hübscher:

var intValue = Question.Role.IntValue();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X