26 Вопрос: Получить значение int из enum в C #

вопрос создан в Tue, Feb 27, 2018 12:00 AM

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

    
1605
  1. 2013-06-09 11: 54: 00Z
  2. Я знаю, что опоздал на вечеринку, но вместо того, чтобы определить свой метод как get(int foo), вы можете определить его как get(Question foo), а затем выполнить кастинг внутри метода, вы можете вызовите ваш метод как Questions.Get(Question.Role)
    2017-02-07 15: 10: 56Z
26 ответов                              26                         

Просто приведите перечисление, например.

 
int something = (int) Question.Role;

Вышеуказанное будет работать для подавляющего большинства перечислений, которые вы видите в дикой природе, поскольку базовый тип по умолчанию для перечисления - int.

Однако, как указывает cecilphillip , перечисления могут иметь различные базовые типы. Если перечисление объявлено как uint, long или ulong, оно должно быть приведено к типу перечисления; например для

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

вы должны использовать

 
long something = (long)StarsInMilkyWay.Wolf424B;
    
2078
2018-02-27 15: 20: 50Z
  1. @ Гарри, это не правда. Вы можете создать Перечисление без приведения, это не обязательно. и я назначаю номер только в особых случаях, большую часть времени, я оставляю его как значение по умолчанию. но вы можете сделать enum Test { Item = 1 } и увидеть, что 1 == (int)Test.Item равен.
    2012-06-28 20: 47: 57Z
  2. @ Jaider (int)Test.Item Это актерский состав! () - явный оператор приведения.
    2012-07-26 19: 02: 32Z
  3. @ Sinthia V он сказал, что вы можете создать его без приведения, что правильно
    2012-08-17 18: 30: 11Z
  4. Если базовый тип для enum Question был не int, а long, это приведение будет урезать целое значение Role с!
    2013-10-29 16: 14: 19Z
  5. Когда вы принимаете Enum в качестве параметра, вы знаете, что вы можете получить только фиксированное число возможных целочисленных значений. С другой стороны, если вы берете просто int, то вам нужно проверить, находится ли этот int в допустимых значениях, что усложняет код. Вы всегда можете переопределить свои подписи как `` `public void MyMethod (int x) {//сделать что-то с x} public void MyMethod (Enum x) {this.MyMethod ((int) x); } `` ``
    2015-08-18 16: 52: 31Z

Поскольку перечисления могут быть любого целочисленного типа (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);

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

    
276
2018-02-27 15: 05: 52Z
  1. Этот метод оправдал себя при работе с универсальным типом, где T: enum(на самом деле T: struct, IConvertible, но это другая история).
    2011-07-05 23: 20: 54Z
  2. Как бы вы изменили это, чтобы распечатать шестнадцатеричное значение стороны? Этот пример показывает десятичное значение. Проблема в том, что var относится к типу object, поэтому вам нужно распаковать его, и он станет еще грязнее, чем мне бы хотелось.
    2012-11-09 02: 15: 11Z
  3. Я думаю, что вы должны изменить пример на object val = Convert...etc, а var в вашем примере всегда будет object.
    2013-10-23 08: 20: 48Z
  4. @ TimAbell Все, что я могу действительно сказать, - это то, что мы обнаружили, что динамически скомпилированные страницы aspx (где необходимо развернуть файлы .cs на действующем сервере) назначают целые числа по-разному для каждого значения. Это означало, что сериализованные объекты на одном компьютере были десериализованы с разными значениями на другом компьютере и фактически были повреждены (что привело к путанице часов ). Мы подняли его с помощью MS, и я, кажется, вспоминаю, что они сказали, что автоматически сгенерированные целые не гарантировались одинаковыми при сборке в разных версиях фреймворка.
    2015-03-24 09: 42: 39Z
  5. @ TimAbell В отдельном случае разработчик удалил устаревшее /неиспользуемое значение Enum, в результате чего все остальные значения в последовательности были удалены одним. Таким образом, наши стандарты кодирования теперь требуют, чтобы идентификаторы всегда указывались явно, в противном случае добавление /удаление или даже автоматическое форматирование кода (например, сортировка по алфавиту) изменит все значения, вызывающие повреждение данных. Я настоятельно рекомендую всем указывать все целые числа Enum явно. Это очень важно, если они соотносятся с внешними (в базе данных) сохраненными значениями.
    2015-03-24 09: 46: 02Z

Объявите его как статический класс, имеющий открытые константы:

 
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 или как вы его определяете.

    
177
2018-02-27 16: 43: 28Z
  1. Я удивлен, что не набрал больше голосов - это так очевидно, если вы действительно хотите использовать тип int изначально.
    2013-05-15 19: 40: 28Z
  2. Я бы использовал static readonly int, потому что константы скомпилированы в их жесткие значения. См. stackoverflow.com/a/755693/492
    2013-05-15 23: 16: 22Z
  3. Это решение на самом деле не дает реальной выгоды от строго типизированных перечислений. Если бы я только хотел передать параметр GameState-enum-параметру, например, конкретному методу, компилятор не должен позволять мне передавать какую-либо переменную типа int в качестве параметра.
    2014-04-12 18: 24: 41Z
  4. @ CADBloke, именно поэтому вы бы использовали const, а не static readonly, потому что каждый раз, когда вы сравниваете static readonly, вы делаете вызов метода, чтобы получить значение переменной, тогда как с const вы сравниваете два типа значений напрямую.
    2014-08-14 17: 11: 55Z
  5. @ brettof86 Да, const будет быстрее, если ограничение компиляции никогда не будет проблемой, тогда все хорошо.
    2014-08-15 10: 57: 48Z
 
Question question = Question.Role;
int value = (int) question;

Результатом будет value == 2.

    
78
2009-06-03 06: 48: 16Z
  1. Вопрос о временной переменной не нужен.
2009-06-03 06: 51: 01Z
  • Итак, что-то вроде этого Questions.Get (Convert.ToInt16 (Question.Applications))
    2009-06-03 06: 51: 13Z
  • нет необходимости конвертировать его - просто приведите.
    2009-06-03 06: 52: 46Z
  • Вы можете просто привести в любом направлении; единственное, на что нужно обратить внимание, это на то, что перечисления ничего не приводят в исполнение (значение перечисления может быть 288, хотя с таким числом не существует вопроса)
    2009-06-03 06: 54: 57Z
  • @ Gishu Можно сказать, что это ... сомнительно. ;)
    2017-12-16 16: 10: 50Z
  • В связанной заметке, если вы хотите получить значение int из 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);
    

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

        
    64
    2015-08-13 00: 12: 45Z
    1. Хотя второй самый быстрый.
      2019-06-16 11: 47: 55Z

    Это проще, чем вы думаете - перечисление уже int. Это просто нужно напомнить:

     
    int y = (int)Question.Role;
    Console.WriteLine(y); // prints 2
    
        
    37
    2018-03-07 13: 52: 42Z
    1. Nitpick: это перечисление уже является int. Другие перечисления могут быть разных типов - попробуйте "enum SmallEnum: byte {A, B, C}"
      2009-06-03 06: 56: 05Z
    2. Абсолютно верно. Ссылка C #: «Каждый тип перечисления имеет базовый тип, который может быть любым целым типом, кроме char.»
      2009-06-03 06: 59: 04Z

    Пример: р>  

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

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

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

    или р>  

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

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

        
    27
    2018-12-03 12: 56: 23Z
    1. Это на самом деле компилируется?
      2016-01-07 20: 04: 00Z
    2. Может ли что-то, что является Раджем, также быть Рахулом или Приянкой? Ваши ценности конфликтуют и должны удвоиться, чтобы быть уникальными, например 0, 1, 2, 4, 8 и т. Д. Это моя основная проблема с перечислениями.
      2016-11-14 21: 58: 04Z
    3. Я вполне уверен, что кома отсутствует после Raj = 1, а Public Enum должна быть public enum
      2018-02-26 14: 03: 59Z

    Я недавно отказался от использования перечислений в моем коде, вместо этого вместо использования классов с защищенными конструкторами и предопределенными статическими экземплярами (спасибо Roelof - C # Обеспечение допустимых значений перечисления - метод будущего ().

    В свете вышесказанного, как я теперь подхожу к этому вопросу (включая неявное преобразование в /из 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)
    }
    

    Преимущество этого подхода состоит в том, что вы получаете все, что у вас было бы из перечисления, но теперь ваш код стал гораздо более гибким, поэтому, если вам нужно выполнять различные действия, основанные на значении Question, вы можете поместить логику в сам Question ( т. е. в предпочтительном режиме OO), вместо того, чтобы помещать в регистр множество операторов case для решения каждого сценария.

    Примечание: ответ обновлен 2018-04-27, чтобы использовать функции C # 6; то есть выражения объявления и определения тела лямбда-выражения. См. историю изменений с оригинальным кодом. Это дает преимущество, делая определение немного менее многословным; которая была одной из основных жалоб на подход этого ответа.

        
    20
    2018-04-27 08: 55: 31Z
    1. Я полагаю, это компромисс между явным приведением и кодом, который вы должны написать, чтобы обойти его. Все еще люблю реализацию, просто жаль, что это не было так долго. +1
      2013-08-02 10: 40: 29Z
    2. Я использовал несколько различных типов классов, структурированных аналогично этому. Я нахожу, что они творят чудеса, пытаясь следовать методологии «не дай мне быть идиотом позже».
      2016-09-08 16: 13: 08Z

    Если вы хотите получить целое число для значения 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.

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

        
    17
    2018-02-27 16: 02: 47Z
    1. кодирование на голландском языке. о дорогой.
      2019-01-09 14: 57: 07Z
    2. К сожалению, этот подход дает низкую производительность, чем больше вы его используете. Я попробовал это в своем коде, и с течением времени мое приложение становилось все медленнее и медленнее, с все меньшим использованием процессора. Это подразумевало, что потоки чего-то ожидали - я предполагаю какую-то сборку мусора, возможно, из-за помещения параметра enum в ToInt32 (). Переключившись на простой int.Parse (), я смог полностью устранить эту низкую производительность, и производительность осталась прежней, независимо от того, как долго выполнялся код.
      2019-02-04 18: 38: 32Z

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

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

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

        
    14
    2011-07-23 20: 03: 17Z

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

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

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

     
    Name: Role, Value: 2
    
        
    11
    2014-09-19 05: 42: 30Z

    Возможно, я пропустил это, но кто-нибудь пробовал простой общий метод расширения. Это прекрасно работает для меня. Таким способом вы можете избежать приведения типов в вашем 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
    2014-09-27 01: 30: 47Z
    1. Возможно, потому что выполнение (int) customFlag меньше печатает вокруг и делает более или менее одно и то же?
      2014-11-11 17: 32: 34Z
     
    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, который удовлетворяет этому типу ожиданий во многих областях.

        
    10
    2018-02-27 17: 07: 43Z
     
    int number = Question.Role.GetHashCode();
    

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

        
    9
    2015-10-27 12: 26: 37Z
    1. GetHashCode - это один из способов получить значение из общей маски Enum
      2018-11-09 04: 08: 07Z

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

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

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

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

    или р>  

    int value = Question.Role.getNumberValue();
    
        
    8
    2012-12-09 22: 51: 24Z
    1. Бронек, вы создали неинформативный синтаксис с помощью метода расширения (не универсального, кстати), который на самом деле занимает больше времени для записи. Я не вижу, как это лучше, чем оригинальное решение от Tetraneutron. Давайте не будем превращать это в чат, помощь всегда приветствуется в stackoverflow, и все здесь, чтобы помочь. Пожалуйста, примите мой комментарий как конструктивную критику.
      2012-12-10 00: 28: 00Z
    2. Бенджамин, во-первых, почему ты удалил мой комментарий? Я не понимаю твоих решений - может быть, кто-то другой в сообществе согласится с моим комментарием. Во-вторых, мое решение обернуло одно Tetraneutron, и оно точно и проще, и меньше написано, потому что IntelliSense предлагает метод расширения. Поэтому я думаю, что ваше решение не беспристрастно и репрезентативно. Я вижу много похожих ответов на Stack, и это нормально. В любом случае, я использую свое решение и, возможно, некоторые люди выберут мое решение в будущем, но эти отрицательные моменты затрудняют его поиск. Самое главное, что это правильно, а не копировать.
      2012-12-10 03: 20: 15Z
    3. @ Bronek Если вы не пингуете меня, я не получаю никаких признаков того, что вы ответили. Я не удалил ваш комментарий. У меня нет возможности или я хочу это сделать. Скорее всего, мод пришел и удалил его - вы можете пометить его для внимания модератора и спросить почему или еще лучше - спросите на Переполнение стека мета . У меня есть мнение о вашем решении с точки зрения программирования, которое совершенно по моему праву - для этого и нужны комментарии, не нужно воспринимать его как личный.
      2013-08-07 14: 45: 58Z

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

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

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

     
    var intValue = Question.Role.IntValue();
    
        
    7
    2014-04-21 02: 51: 42Z
     
    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);
    }
    
        
    4
    2018-07-27 06: 29: 29Z

    Мой любимый хак с 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    
    

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

        
    3
    2015-07-17 13: 47: 15Z

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

     
    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
    2018-11-16 06: 25: 40Z

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

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

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

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

        
    2
    2015-08-03 07: 12: 01Z

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

     
    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;
    
        
    2
    2018-11-16 06: 49: 35Z

    Самым простым решением, которое я могу придумать, является перегрузка метода 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
    2013-01-28 14: 09: 43Z

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

     
    public static class ReturnType
    {
        public static readonly int Success = 1;
        public static readonly int Duplicate = 2;
        public static readonly int Error = -1;        
    }
    
        
    1
    2014-01-14 20: 28: 07Z

    В Vb. Это должно быть

     
    Public Enum Question
        Role = 2
        ProjectFunding = 3
        TotalEmployee = 4
        NumberOfServers = 5
        TopBusinessConcern = 6
    End Enum
    
    Private value As Integer = CInt(Question.Role)
    
        
    1
    2016-04-12 07: 09: 30Z
    1. Вопрос для C #.
      2018-11-19 13: 37: 00Z

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

     
    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
    2019-03-02 17: 55: 26Z

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

     
    int value = YourEnum.ToString("D");
    
        
    - 14
    2013-10-23 07: 47: 58Z
    источник размещен Вот
    Другие вопросы