Получить значение int из enum в C # - PullRequest
1601 голосов
/ 03 июня 2009

У меня есть класс с именем 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)?

Ответы [ 26 ]

11 голосов
/ 27 сентября 2014

Может быть, я пропустил это, но кто-нибудь пробовал простой общий метод расширения. Это прекрасно работает для меня. Таким способом вы можете избежать приведения типов в вашем API, но в конечном итоге это приведет к операции изменения типа. Это хороший случай для программирования Roselyn, чтобы компилятор сделал метод GetValue для вас.

    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;
    }
}    
11 голосов
/ 19 сентября 2014

Еще один способ сделать это:

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

Результатом будет:

Name: Role, Value: 2
10 голосов
/ 31 марта 2014
public enum QuestionType
{
    Role = 2,
    ProjectFunding = 3,
    TotalEmployee = 4,
    NumberOfServers = 5,
    TopBusinessConcern = 6
}

... это прекрасная декларация.

Вы должны привести результат к int следующим образом:

int Question = (int)QuestionType.Role

В противном случае тип по-прежнему QuestionType.

Этот уровень строгости является способом C #.

Одна альтернатива - использовать объявление класса:

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
}

Объявлять менее элегантно, но вам не нужно приводить его в коде:

int Question = QuestionType.Role

В качестве альтернативы вы можете чувствовать себя более комфортно с Visual Basic, который удовлетворяет этому типу ожиданий во многих областях.

9 голосов
/ 19 сентября 2014
int number = Question.Role.GetHashCode();

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

8 голосов
/ 10 декабря 2012

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

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();
7 голосов
/ 21 апреля 2014

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

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

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

var intValue = Question.Role.IntValue();
4 голосов
/ 27 июля 2018
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);
}
3 голосов
/ 16 декабря 2016

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

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;
}
3 голосов
/ 26 июня 2015

Мой любимый хак с int или меньшими перечислениями:

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    

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

2 голосов
/ 03 августа 2015

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

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

int answer = (int)Sample.Book;

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

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

...