own - Erhalten Sie int-Wert von enum in C#




handle enum c# (16)

Ich habe eine Klasse namens Questions (Plural). In dieser Klasse gibt es eine Enumeration 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 Funktion get(int foo) , die ein Questions Objekt für dieses foo zurückgibt. Gibt es eine einfache Möglichkeit, den Integer-Wert aus der Enumeration zu erhalten, damit ich etwas wie Questions.Get(Question.Role) tun kann?


Beispiel:

Public Enum EmpNo
{
    Raj = 1
    Rahul,
    Priyanka
}

Und im Code dahinter, um enum Wert zu bekommen:

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

oder

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

Enums werden um 1 erhöht und Sie können den Startwert festlegen. Andernfalls wird es zunächst als 0 zugewiesen.


Da Enums ein ganzzahliger Typ sein können ( byte , int , short usw.), wäre es eine robustere Methode, den zugrunde liegenden Integralwert der GetTypeCode zu erhalten, GetTypeCode die GetTypeCode Methode in Verbindung mit der Convert Klasse verwenden:

enum Sides {
    Left, Right, Top, Bottom
}
Sides side = Sides.Bottom;

object val = Convert.ChangeType(side, side.GetTypeCode());
Console.WriteLine(val);

Dies sollte unabhängig vom zugrunde liegenden Integraltyp funktionieren.


Das Beispiel, das ich vorschlagen möchte, um 'int' Wert von enum zu bekommen, ist '

public enum Sample
{Book =1, Pen=2, Pencil =3}

int answer = (int)Sample.Book;

jetzt wird die Antwort 1 sein.

Ich hoffe, das könnte jemandem helfen.


Deklarieren Sie es als eine statische Klasse mit öffentlichen Konstanten:

public static class Question
{
    public const int Role = 2;
    public const int ProjectFunding = 3;
    public const int TotalEmployee = 4;
    public const int NumberOfServers = 5;
    public const int TopBusinessConcern = 6;
}

Und dann können Sie es als Question.Role referenzieren, und es wird immer zu einem int ausgewertet oder wie immer Sie es definieren.


Ein weiterer Weg, es zu tun:

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

Wird darin enden, dass:

Name: Role, Value: 2

Es ist einfacher als du denkst - ein Enum ist schon ein Int. Es muss nur daran erinnert werden:

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

Ich habe vor kurzem die Verwendung von enums in meinem Code zugunsten der Verwendung von Klassen mit geschützten Konstruktoren und vordefinierten statischen Instanzen (dank Roeloff - C # sicherstellen, gültige Enum-Werte - Futureproof-Methode ) konvertiert .

Vor diesem Hintergrund möchte ich nun näher auf dieses Problem eingehen (einschließlich der impliziten Konvertierung von / nach 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 Enumeration haben würden, aber Ihr Code ist jetzt viel flexibler. Sollten Sie verschiedene Aktionen basierend auf dem Wert von Question , können Sie die Logik selbst in Question bevorzugte OO-Mode) im Gegensatz zu vielen Fall Aussagen im gesamten Code, um jedes Szenario zu bewältigen.

NB: Beantworten Sie die Aktualisierung von 2018-04-27, um C # 6 Funktionen zu nutzen; dh Deklarationsausdrücke und Lambda-Ausdruckskörperdefinitionen. Siehe den Versionsverlauf für den Originalcode. Dies hat den Vorteil, dass die Definition etwas weniger ausführlich wird; Das war eine der Hauptbeschwerden über den Ansatz dieser Antwort.


In Vb. Es sollte sein

Public Enum Question
    Role = 2
    ProjectFunding = 3
    TotalEmployee = 4
    NumberOfServers = 5
    TopBusinessConcern = 6
End Enum

Private value As Integer = CInt(Question.Role)

Probieren Sie dieses aus, statt enum in int zu konvertieren:

public static class ReturnType
{
    public static readonly int Success = 1;
    public static readonly int Duplicate = 2;
    public static readonly int Error = -1;        
}

Sie können dies tun, indem Sie eine Erweiterungsmethode für Ihren definierten Enum-Typ implementieren:

public static class MyExtensions
{
    public static int getNumberValue(this Question questionThis)
    {
        return (int)questionThis;
    }
}

Dies vereinfacht das Erhalten des int-Werts des aktuellen Enum-Werts:

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

oder

int value = Question.Role.getNumberValue();

Versuche dies :

int value = YourEnum.ToString("D");

Vielleicht habe ich es verpasst, aber jemand hat eine einfache generische Erweiterungsmethode versucht. 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 Roselyn, damit der Compiler eine GetValue-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;
    }
}    

Wenn Sie eine Ganzzahl für den Enum-Wert erhalten möchten, die in einer Variablen gespeichert ist und der Typ Question , um sie beispielsweise 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();
}

Dies ändert den Fenstertitel auf 4, weil die Variable Geselecteerd ist. Wenn ich es in Talen.Portugees und die Methode erneut aufrufen, ändert sich der Text in 3.

Ich hatte es schwer, diese einfache Lösung im Internet zu finden, und ich konnte sie nicht finden, also habe ich etwas getestet und herausgefunden. Hoffe das hilft. ;)


Werfen Sie einfach die Enum, z

int something = (int) Question.Role;

Das oben genannte funktioniert für die überwiegende Mehrheit der Enums, die Sie in der freien Wildbahn sehen, da der Standardtyp für eine Enumeration int .

Wie cecilphillip darauf hinweist, können Enums unterschiedliche Typen haben. Wenn eine Aufzählung als uint , long oder ulong , sollte sie in den Typ der Aufzählung umgewandelt werden. zB für

enum StarsInMilkyWay:long {Sun = 1, V645Centauri = 2 .. Wolf424B = 2147483649};

du solltest benutzen

long something = (long)StarsInMilkyWay.Wolf424B;

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

Wird zu value == 2 .


int number = Question.Role.GetHashCode();

number sollte den Wert 2 .





int