индексу - Получить значение int из enum в C#




enum to int c++ (17)

У меня есть класс под названием « Questions (множественное число)». В этом классе есть перечисление под названием Question (сингулярное), которое выглядит так.

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

В классе « Questions » у меня есть функция get(int foo) которая возвращает объект « Questions для этого foo . Есть ли простой способ получить целочисленное значение из перечисления, чтобы я мог сделать что-то вроде Questions.Get(Question.Role) ?


В Vb. Так должно быть

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

Private value As Integer = CInt(Question.Role)

В соответствующей заметке, если вы хотите получить значение int из System.Enum , тогда System.Enum e здесь:

Enum e = Question.Role;

Ты можешь использовать:

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

Последние два уродливые. Я предпочитаю первый.


Вы можете сделать это, внедрив метод расширения в свой определенный тип перечисления:

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

Это упрощает получение значения int текущего значения перечисления:

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

или же

int value = Question.Role.getNumberValue();

Если вы хотите получить целое число для значения enum, которое хранится в переменной, тип которой будет Question , для использования, например, в методе, вы можете просто сделать это, я написал в этом примере:

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

Это изменит название окна на 4, потому что переменная Geselecteerd - Talen.Nederlands . Если я изменю его на Talen.Portugees и снова вызову метод, текст изменится на 3.

Мне было трудно найти это простое решение в Интернете, и я не мог его найти, поэтому я что-то тестировал и нашел это. Надеюсь это поможет. ;)


Как насчет метода расширения:

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

И использование немного красивее:

var intValue = Question.Role.IntValue();

Мой fav-хак с int или less перечислениями:

GetHashCode();

Для перечисления

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

этот

var values = Enum.GetValues(typeof(Test));

foreach (var val in values) 
{
    Console.WriteLine(val.GetHashCode());
    Console.WriteLine(((int)val));
    Console.WriteLine(val);
}

выходы

one
1
1  
max
2147483647
2147483647    
min
-2147483648
-2147483648    

Отказ от ответственности: не работает для перечислений на основе длинных


Ниже приведен метод расширения

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

Объявите его как статический класс с общедоступными константами:

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

И тогда вы можете ссылаться на него как на Question.Role , и он всегда оценивает int или как вы его определяете.


Попробуйте это вместо преобразования enum в int:

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

Поскольку Enums может быть любым интегральным типом ( byte , int , short и т. Д.), Более надежным способом получить базовое целочисленное значение перечисления было бы использование метода GetTypeCode в сочетании с классом Convert :

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

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

Это должно работать независимо от базового интегрального типа.


Пример, который я хотел бы предложить «получить значение« int »из перечисления,

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

int answer = (int)Sample.Book;

теперь ответ будет 1.

Надеюсь, это может помочь кому-то.


Пример:

Public Enum EmpNo
{
    Raj = 1
    Rahul,
    Priyanka
}

И в коде, чтобы получить значение перечисления:

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

или же

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

Enums увеличится на 1, и вы можете установить начальное значение. Иначе он будет назначен как 0 изначально.


Самое легкое решение, о котором я могу думать, это перегрузка метода Get(int) следующим образом:

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

где [modifiers] обычно могут быть такими же, как и для метода Get(int) . Если вы не можете редактировать класс « Questions » или по какой-то причине этого не хотите, вы можете перегрузить метод, написав расширение:

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

Чтобы обеспечить значение enum и затем проанализировать его, вы также можете сделать следующее.

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

Надеюсь, это поможет.


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

В результате value == 2 .


int number = Question.Role.GetHashCode();

number должен иметь значение 2 .


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






int