Krijg int-waarde van enum in C#

Ik heb een klas genaamd Questions(meervoud). In deze klasse is er een opsomming genaamd Question(enkelvoud) die er als volgt uitziet.

public enum Question
{
    Role = 2,
    ProjectFunding = 3,
    TotalEmployee = 4,
    NumberOfServers = 5,
    TopBusinessConcern = 6
}

In de klasse Questionsheb ik een functie get(int foo)die een Questions-object retourneert voor die foo. Is er een gemakkelijke manier om de gehele waarde van de enum te halen, zodat ik zoiets als dit kan doen Questions.Get(Question.Role)?


Antwoord 1, autoriteit 100%

Geef gewoon de opsomming, bijv.

int something = (int) Question.Role;

Het bovenstaande werkt voor de overgrote meerderheid van de opsommingen die u in het wild ziet, aangezien het standaard onderliggende type voor een enum intis.

Echter, zoals cecilphillipaangeeft, kunnen opsommingen verschillende onderliggende typen hebben.
Als een enum wordt gedeclareerd als een uint, longof ulong, moet het worden gegoten naar het type van de enum; bijv. voor

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

je zou moeten gebruiken

long something = (long)StarsInMilkyWay.Wolf424B;

Antwoord 2, autoriteit 13%

Aangezien Enums elk integraal type kan zijn (byte, int, short, enz.), is een robuustere manier om de onderliggende integrale waarde van de enum zou zijn om gebruik te maken van de GetTypeCodemethode in combinatie met de Convertklasse:

enum Sides {
    Left, Right, Top, Bottom
}
Sides side = Sides.Bottom;
object val = Convert.ChangeType(side, side.GetTypeCode());
Console.WriteLine(val);

Dit zou moeten werken ongeacht het onderliggende integrale type.


Antwoord 3, autoriteit 8%

Declareer het als een statische klasse met openbare constanten:

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;
}

En dan kun je ernaar verwijzen als Question.Role, en het evalueert altijd naar een intof hoe je het ook definieert.


Antwoord 4, autoriteit 4%

Over een verwante opmerking, als u de waarde intvan System.Enumwilt krijgen, geef dan hier e:

Enum e = Question.Role;

U kunt gebruiken:

int i = Convert.ToInt32(e);
int i = (int)(object)e;
int i = (int)Enum.Parse(e.GetType(), e.ToString());
int i = (int)Enum.ToObject(e.GetType(), e);

De laatste twee zijn ronduit lelijk. Ik geef de voorkeur aan de eerste.


Antwoord 5, autoriteit 3%

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

resulteert in value == 2.


Antwoord 6, Autoriteit 2%

Het is gemakkelijker dan je denkt – een enum is al een int. Het moet gewoon worden herinnerd:

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

Antwoord 7

Voorbeeld:

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

en in de code achter om de ENUM-waarde te krijgen:

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

of

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

ENUMS zal met 1 verhogen en u kunt de startwaarde instellen. Als u de startwaarde niet instelt, wordt deze aanvankelijk als 0 toegewezen.


Antwoord 8

Ik heb onlangs gecombineerd van het gebruik van ENUM’s in mijn code ten gunste van in plaats van klassen met beschermde constructeurs en vooraf gedefinieerde statische instanties (dankzij Roelof – C # Zorg voor geldige ENUM-waarden – toekomstvaste methode ).

In het licht daarvan is hieronder hoe ik dit probleem nu benadert (inclusief impliciete conversie van / naar 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)
}

Het voordeel van deze aanpak is dat je alles krijgt wat je zou hebben van de opsomming, maar je code is nu veel flexibeler, dus als je verschillende acties moet uitvoeren op basis van de waarde van Question, dan kan logica in Questionzelf plaatsen (dwz op de geprefereerde OO-manier) in plaats van veel case-statements in uw code te plaatsen om elk scenario aan te pakken.


NB: Antwoord bijgewerkt op 27-04-2018 om gebruik te maken van C# 6-functies; d.w.z. declaratie-expressies en lambda-expressie body definities. Zie revisiegeschiedenisvoor originele code. Dit heeft het voordeel dat de definitie iets minder uitgebreid wordt; wat een van de belangrijkste klachten was over de aanpak van dit antwoord.


Antwoord 9

Als u een geheel getal wilt krijgen voor de enum-waarde die is opgeslagen in een variabele, waarvan het type Questionzou zijn, om bijvoorbeeld in een methode te gebruiken, kunt u dit eenvoudig doen. schreef in dit voorbeeld:

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();
}

Hierdoor wordt de venstertitel gewijzigd in 4, omdat de variabele GeselecteerdTalen.Nederlandsis. Als ik het verander in Talen.Portugeesen de methode opnieuw aanroep, verandert de tekst in 3.


Antwoord 10

Om er zeker van te zijn dat er een opsommingswaarde bestaat en deze vervolgens te ontleden, kunt u ook het volgende doen.

// 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() + ".");

Antwoord 11

Nog een manier om het te doen:

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

Het resulteert in:

Name: Role, Value: 2

Antwoord 12

Misschien heb ik het gemist, maar heeft iemand een eenvoudige generieke extension-methode geprobeerd?

Dit werkt geweldig voor mij. U kunt het type in uw API op deze manier voorkomen, maar uiteindelijk resulteert het in een wijzigingstype. Dit is een goed case voor programmeren roslyn om de compiler te laten maken een get -alue & lt; t & gt; methode voor u.

   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;
    }
}

Antwoord 13

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

… is een fijne verklaring.

U moet het resultaat uitzetten om zo te zeggen:

int Question = (int)QuestionType.Role

Anders is het type nog steeds QuestionType.

Dit niveau van striktheid is de C # -weg.

Eén alternatief is om in plaats daarvan een klassenaangifte te gebruiken:

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
}

Het is minder elegant om te declareren, maar je hoeft het niet in code te werpen:

int Question = QuestionType.Role

Als alternatief kunt u zich meer op uw gemak voelen bij Visual Basic, dat op veel gebieden aan dit soort verwachtingen voldoet.


Antwoord 14

int number = Question.Role.GetHashCode();

numbermoet de waarde 2hebben.


Antwoord 15

U kunt dit doen door een extensiemethodete implementeren op uw gedefinieerde opsommingstype:

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

Dit vereenvoudigt het verkrijgen van de int-waarde van de huidige enum-waarde:

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

of

int value = Question.Role.getNumberValue();

Antwoord 16

Gebruik in plaats daarvan een extensiemethode:

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

En het gebruik is iets mooier:

var intValue = Question.Role.IntValue();

Antwoord 17

Gebruik:

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

Het zal resulteren in value == 2.

Dit is alleen waar als de enum binnen een intpast.


Antwoord 18

public enum Suit : int
{
    Spades = 0,
    Hearts = 1,
    Clubs = 2,
    Diamonds = 3
}
Console.WriteLine((int)(Suit)Enum.Parse(typeof(Suit), "Clubs"));
// From int
Console.WriteLine((Suit)1);
// From a number you can also
Console.WriteLine((Suit)Enum.ToObject(typeof(Suit), 1));
if (typeof(Suit).IsEnumDefined("Spades"))
{
    var res = (int)(Suit)Enum.Parse(typeof(Suit), "Spades");
    Console.Out.WriteLine("{0}", res);
}

Antwoord 19

Omdat enums kunnen worden gedeclareerd met meerdere primitieve typen, kan een generieke uitbreidingsmethode voor het casten van elk enum-type nuttig zijn.

enum Box
{
    HEIGHT,
    WIDTH,
    DEPTH
}
public static void UseEnum()
{
    int height = Box.HEIGHT.GetEnumValue<int>();
    int width = Box.WIDTH.GetEnumValue<int>();
    int depth = Box.DEPTH.GetEnumValue<int>();
}
public static T GetEnumValue<T>(this object e) => (T)e;

Antwoord 20

Hier volgt de extensiemethode

public static string ToEnumString<TEnum>(this int enumValue)
{
    var enumString = enumValue.ToString();
    if (Enum.IsDefined(typeof(TEnum), enumValue))
    {
        enumString = ((TEnum) Enum.ToObject(typeof (TEnum), enumValue)).ToString();
    }
    return enumString;
}

Antwoord 21

De gemakkelijkste oplossing die ik kan bedenken is de Get(int)methode als volgt te overbelasten:

[modifiers] Questions Get(Question q)
{
    return Get((int)q);
}

waar [modifiers]over het algemeen hetzelfde kan zijn als voor de Get(int)methode. Als u de klasse Questionsniet kunt bewerken of om de een of andere reden niet wilt, kunt u de methode overbelasten door een extensie te schrijven:

public static class Extensions
{
    public static Questions Get(this Questions qs, Question q)
    {
        return qs.Get((int)q);
    }
}

Antwoord 22

Mijn favoriete hack met int of kleinere opsommingen:

GetHashCode();

Voor een opsomming

public enum Test
{
    Min = Int32.MinValue,
    One = 1,
    Max = Int32.MaxValue,
}

Dit,

var values = Enum.GetValues(typeof(Test));
foreach (var val in values)
{
    Console.WriteLine(val.GetHashCode());
    Console.WriteLine(((int)val));
    Console.WriteLine(val);
}

uitgangen

one
1
1
max
2147483647
2147483647
min
-2147483648
-2147483648

Disclaimer:

Het werkt niet voor opsommingen op basis van lang.


Antwoord 23

Probeer deze eens in plaats van enum naar int te converteren:

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

Antwoord 24

Het voorbeeld dat ik zou willen voorstellen “om een ​​’INT’-waarde te krijgen van een ENUM”, is

public enum Sample
{
    Book = 1, 
    Pen = 2, 
    Pencil = 3
}
int answer = (int)Sample.Book;

Nu is het antwoord 1.


Antwoord 25

U had type casting zoals we in een andere taal kunnen gebruiken.

Als uw enumis zoals deze –

public enum Question
{
    Role = 2,
    ProjectFunding = 3,
    TotalEmployee = 4,
    NumberOfServers = 5,
    TopBusinessConcern = 6
}

en u moet naar een intworden gegooid, doe dit dan –

Question q = Question.Role;
.............
.............
int something = (int) q;

RE –

In C # zijn er twee soorten gieten:

  • Impliciete gieten (automatisch ) – het converteren van een kleiner type naar een grotere maten met een groter type –

char– & gt; int– & GT; long– & gt; float– & gt; double

  • expliciet gieten (handmatig ) – het converteren van een groter type naar een kleiner type zoals –

double– & GT; float– & gt; long– & gt; int– & GT; char

Meer zijn te vinden in hier .


Antwoord 26

In Visual Basic zou het moeten zijn:

Public Enum Question
    Role = 2
    ProjectFunding = 3
    TotalEmployee = 4
    NumberOfServers = 5
    TopBusinessConcern = 6
End Enum
Private value As Integer = CInt(Question.Role)

Antwoord 27

geeft u een lijst met alle gehele waarden van de enum :

Lijst enumValues = Enum.GetValues(typeof(EnumClass)).Cast().ToList();


Antwoord 28

public enum ViewType
{
    List = 1,
    Table = 2,
};
// You can use the Enum type as a parameter, so any enumeration from any enumerator 
// cshtml
// using proyects.Helpers
// @if (Model.ViewType== (int)<variable>.List )

Antwoord 29

Ik heb deze uitbreidingsmethode bedacht die de huidige taalfuncties bevat. Door dynamisch te gebruiken, hoef ik hier geen generieke methode van te maken en het type te specificeren dat de aanroep eenvoudiger en consistent houdt:

public static class EnumEx
{
    public static dynamic Value(this Enum e)
    {
        switch (e.GetTypeCode())
        {
            case TypeCode.Byte:
            {
                return (byte) (IConvertible) e;
            }
            case TypeCode.Int16:
            {
                return (short) (IConvertible) e;
            }
            case TypeCode.Int32:
            {
                return (int) (IConvertible) e;
            }
            case TypeCode.Int64:
            {
                return (long) (IConvertible) e;
            }
            case TypeCode.UInt16:
            {
                return (ushort) (IConvertible) e;
            }
            case TypeCode.UInt32:
            {
                return (uint) (IConvertible) e;
            }
            case TypeCode.UInt64:
            {
                return (ulong) (IConvertible) e;
            }
            case TypeCode.SByte:
            {
                return (sbyte) (IConvertible) e;
            }
        }
        return 0;
    }

Other episodes