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;

19voto

plavozont Punkte 779

Eine weitere Möglichkeit, dies zu tun:

Console.WriteLine("Name: {0}, Value: {0:D}", Question.Role);

Das Ergebnis wird sein:

Name: Role, Value: 2

17voto

Nathon Punkte 173

Um sicherzustellen, dass ein Enum-Wert vorhanden ist, und ihn dann zu analysieren, können Sie auch wie folgt vorgehen.

// Fake Day of Week
string strDOWFake = "SuperDay";

// Real Day of Week
string strDOWReal = "Friday";

// Will hold which ever is the real DOW.
DayOfWeek enmDOW;

// See if fake DOW is defined in the DayOfWeek enumeration.
if (Enum.IsDefined(typeof(DayOfWeek), strDOWFake))
{
    // This will never be reached since "SuperDay"
    // doesn't exist in the DayOfWeek enumeration.
    enmDOW = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), strDOWFake);
}
// See if real DOW is defined in the DayOfWeek enumeration.
else if (Enum.IsDefined(typeof(DayOfWeek), strDOWReal))
{
    // This will parse the string into it's corresponding DOW enum object.
    enmDOW = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), strDOWReal);
}

// Can now use the DOW enum object.
Console.Write("Today is " + enmDOW.ToString() + ".");

15voto

WonderWorker Punkte 7910
public enum QuestionType
{
    Role = 2,
    ProjectFunding = 3,
    TotalEmployee = 4,
    NumberOfServers = 5,
    TopBusinessConcern = 6
}

...ist eine schöne Erklärung.

Sie müssen das Ergebnis wie folgt in int umwandeln:

int Question = (int)QuestionType.Role

Andernfalls ist der Typ immer noch QuestionType .

Dieses Maß an Strenge ist der Weg von C#.

Eine Alternative ist, stattdessen eine Klassendeklaration zu verwenden:

public class QuestionType
{
    public static int Role = 2,
    public static int ProjectFunding = 3,
    public static int TotalEmployee = 4,
    public static int NumberOfServers = 5,
    public static int TopBusinessConcern = 6
}

Es ist weniger elegant, sie zu deklarieren, aber man muss sie nicht in den Code einbauen:

int Question = QuestionType.Role

Vielleicht fühlen Sie sich aber auch mit Visual Basic wohler, das diese Art von Erwartungen in vielen Bereichen erfüllt.

15voto

GinCanhViet Punkte 323

Úsalo:

Question question = Question.Role;
int value = question.GetHashCode();

Das Ergebnis wird sein value == 2 .

Dies ist nur der Fall, wenn die Aufzählung in eine int .

14voto

Doug Punkte 215

Vielleicht habe ich es übersehen, aber hat jemand eine einfache generische Erweiterungsmethode ausprobiert?

Das funktioniert bei mir hervorragend. Sie können auf diese Weise die Typumwandlung in Ihrer API vermeiden, aber letztendlich führt dies zu einer Operation zur Typänderung. Dies ist ein guter Fall für die Programmierung Roslyn damit der Compiler eine GetValue<T>-Methode für Sie erstellt.

    public static void Main()
    {
        int test = MyCSharpWrapperMethod(TestEnum.Test1);

        Debug.Assert(test == 1);
    }

    public static int MyCSharpWrapperMethod(TestEnum customFlag)
    {
        return MyCPlusPlusMethod(customFlag.GetValue<int>());
    }

    public static int MyCPlusPlusMethod(int customFlag)
    {
        // Pretend you made a PInvoke or COM+ call to C++ method that require an integer
        return customFlag;
    }

    public enum TestEnum
    {
        Test1 = 1,
        Test2 = 2,
        Test3 = 3
    }
}

public static class EnumExtensions
{
    public static T GetValue<T>(this Enum enumeration)
    {
        T result = default(T);

        try
        {
            result = (T)Convert.ChangeType(enumeration, typeof(T));
        }
        catch (Exception ex)
        {
            Debug.Assert(false);
            Debug.WriteLine(ex);
        }

        return result;
    }
}

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