Получить значение 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 ]

2 голосов
/ 06 декабря 2017

Поскольку перечисления могут быть объявлены с несколькими примитивными типами, может пригодиться универсальный метод расширения для приведения любого типа перечисления.

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;
1 голос
/ 12 апреля 2016

В Vb. Должно быть

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

Private value As Integer = CInt(Question.Role)
1 голос
/ 28 января 2013

Самое простое решение, о котором я могу подумать, это перегрузить метод 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);
    }
}
1 голос
/ 15 января 2014

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

public static class ReturnType
{
    public static readonly int Success = 1;
    public static readonly int Duplicate = 2;
    public static readonly int Error = -1;        
}
0 голосов
/ 02 марта 2019

Я немного опоздал к игре, но я придумал этот метод расширения, который включает в себя текущие языковые функции. Используя динамический, мне не нужно делать это универсальным методом и указывать тип, который делает вызов более простым и последовательным. Пожалуйста, дайте мне знать, если я сделал что-то не так:

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;
    }
0 голосов
/ 10 января 2013

Попробуйте это:

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