Получить значение int из перечисления в C#


1,281

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

+16

Для наоборот: [монолитно-INT-к-перечислимого-в-с-острым] (http://stackoverflow.com/questions/29482/cast-int-to-enum-in- с-диез). 09 июн. 132013-06-09 11:54:00

+4

[This post on enums] (http://www.codeducky.org/ins-outs-c-enums/) содержит кучу соответствующих преобразований enum (например, перечисление <=> int и enum <=>), а также другое полезное перечисление stuff 20 июл. 142014-07-20 19:55:05

+3

Я знаю, что опаздываю на вечеринку, но вместо того, чтобы определять ваш метод как 'get (int foo)', вы можете определить его как 'get (Question foo)', а затем выполнить кастинг внутри метода, вы можете позвонить ваш метод как 'Questions.Get (Question.Role)' 07 фев. 172017-02-07 15:10:56

1,689

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

int something = (int) Question.Role; 

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

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

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

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

long something = (long)StarsInMilkyWay.Wolf424B; 
+109

О, давай, я получил 'enum Test {Item = (int) 1}', и я должен использовать его для каждого использования? Позор компилятора не может сделать это для меня. Он должен работать как неявное преобразование. Но, конечно, нет. 13 июн. 122012-06-13 10:45:29

+19

@ Харри это неправда. Вы можете создать Enumeration без кастинга, это не требуется. и я только назначаю число в особых случаях, большую часть времени я оставляю его как значение по умолчанию. но вы можете сделать 'enum Test {Item = 1}' и увидеть, что '1 == (int) Test.Item' равно. 28 июн. 122012-06-28 20:47:57

+25

@Jaider '(int) Test.Item' Это актерский состав!() является явным оператором литья. 26 июл. 122012-07-26 19:02:32

+41

@ Sinthia V он сказал, что вы можете * создать * его без литья, что правильно 17 авг. 122012-08-17 18:30:11

  0

это можно сделать как свойство заранее? 06 дек. 122012-12-06 01:28:19

+5

Если базовый тип для 'enum Question' не был' int', а 'long', этот приведение будет усекать интегральное значение Role! 29 окт. 132013-10-29 16:14:19

  0

@PaulRidgway это не вопрос. 08 апр. 152015-04-08 09:19:06

  0

Вы правы, конечно. Я забыл свой язык программирования (на некоторых языках длинное 32-разрядное целое число со знаком). Конечно, 64-битное целое число достигает 9,2 квинтиллиона! 13 авг. 152015-08-13 07:00:24

+1

Когда вы принимаете параметр «Enum» в качестве параметра, вы знаете, что это только фиксированное количество возможных интегральных значений, которые вы можете получить. С другой стороны, если вы просто используете 'int', тогда вам нужно проверить, соответствует ли это' int' принятым значениям, что усложняет код. Вы всегда можете изменить свои подписи как '' ' общественных ничтожной MyMethod (интермедиат х) { // сделать что-то с й } общественного недействительное MyMethod (Enum х) { this.MyMethod ((INT) Икс); } '' '' 18 авг. 152015-08-18 16:52:31

  0

и наоборот? 25 июл. 162016-07-25 21:07:52

  0

Я чувствую, что было бы лучше использовать 'static_cast' 25 дек. 162016-12-25 00:26:05

  0

@ Ant6n - это не просто метод C++? 06 янв. 172017-01-06 15:38:08

  0

@ 1blustone вкратце, static_cast более безопасен и должен быть предпочтительным: http://stackoverflow.com/questions/103512/in-c-why-use-static-castintx-instead-of-intx 06 янв. 172017-01-06 20:50:59

+4

@ Ant6n, но это является вопросом C# 06 янв. 172017-01-06 21:12:40

  0

Я бы уклонился от использования Long и Enum, но может быть конкретный вариант использования, где это действительно имеет смысл. 09 фев. 182018-02-09 17:52:09


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

В результате получится value == 2.

+28

Вопрос временной переменной не нужен. 03 июн. 092009-06-03 06:51:01

+1

Так что-то вроде этого Questions.Get (Convert.ToInt16 (Question.Applications)) 03 июн. 092009-06-03 06:51:13

+3

нет необходимости его конвертировать - просто лить. 03 июн. 092009-06-03 06:52:46

+4

Вы можете просто бросить в любом направлении; единственное, что нужно посмотреть, это то, что перечисления не применяют ничего (значение перечисления может быть 288, хотя ни один вопрос не существует с этим числом) 03 июн. 092009-06-03 06:54:57

  0

@jim: Нет, просто введите значение: Question.Get ((int) Question. Приложения); 03 июн. 092009-06-03 06:55:13

  0

спасибо всем ... Я просто хочу быть ясным ... кастинг Question.Role возвращает 2, значение, а не 1 индекс ... правильно? 03 июн. 092009-06-03 06:57:43

  0

(хотя для индекса это будет 0, но это ни здесь, ни там) 03 июн. 092009-06-03 07:03:11

  0

Временная переменная не нужна в производстве, но здесь ясно, что это возможно. Ответ был бы неоднозначным без этого. 06 окт. 162016-10-06 11:18:23

  0

@ Гишу Вы могли бы сказать, что это ... сомнительно. ;) 16 дек. 172017-12-16 16:10:50


24

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

int y = (int)Question.Role; 
Console.WriteLine(y); // prints 2 
+10

Nitpick: * this * enum уже есть int. Другие перечисления могут быть разных типов - try "enum SmallEnum: byte {A, B, C}" 03 июн. 092009-06-03 06:56:05

+5

Абсолютно верно. Ссылка на C#: «Каждый тип перечисления имеет базовый тип, который может быть любым целым типом, кроме символа». 03 июн. 092009-06-03 06:59:04

  0

Как ваш способ объяснить! 04 фев. 162016-02-04 12:22:57


18

Пример:

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 

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

+5

Это действительно компилируется? 07 янв. 162016-01-07 20:04:00

  0

Может ли что-то, что есть Радж, быть Рахулом или Прияной? Ваши ценности конфликтуют и должны быть двойными, чтобы быть уникальными, например. 0, 1, 2, 4, 8 и т. Д. Это моя основная проблема с перечислениями. 14 ноя. 162016-11-14 21:58:04

  0

Я уверен, что комма отсутствует после 'Raj = 1', а' Public Enum' должен быть 'public enum' 26 фев. 182018-02-26 14:03:59


222

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

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

+20

Этот метод доказал свою ценность для меня, когда речь идет о родовом типе, где T: enum (фактически T: struct, IConvertible, но это совсем другая история). 05 июл. 112011-07-05 23:20:54

+1

Как вы можете изменить это, чтобы распечатать шестнадцатеричное значение стороны? В этом примере показано десятичное значение. Проблема заключается в том, что 'var' имеет тип' object', поэтому вам нужно распаковать его, и он становится более грязным, чем хотелось бы. 09 ноя. 122012-11-09 02:15:11

+1

Я думаю, вы должны изменить пример на 'object val = Convert ... etc' 'var' в вашем примере всегда будет' object'. 23 окт. 132013-10-23 08:20:48

  0

Я не думаю, что это имеет большое значение, но если это сделает ответ более ясным ... sure 23 окт. 132013-10-23 18:58:07

+1

Если вы хотите конвертировать в int try (в случае enum Sides: int) [...] object val = Convert.ChangeType (side, typeof (int)); [...] 09 июн. 142014-06-09 16:05:23

+1

Вы всегда должны указывать значение int каждого параметра перечисления, поскольку присвоенное число не гарантируется и может варьироваться в зависимости от системы. Если вы затем создадите DLL в другой системе, значения перечисления могут измениться. Это вызвало у меня кошмар проблемы в прошлом, когда значения перечисления должны были соответствовать значениям базы данных. 06 авг. 142014-08-06 09:58:20

  0

@NickG могу ли я спросить, что вызвало изменение присвоенных номеров? Я спрашиваю, потому что я никогда не слышал об этом и всегда полагался на документированное поведение - https://msdn.microsoft.com/en-us/library/sbbt4032.aspx "По умолчанию первый счетчик имеет значение 0" 23 мар. 152015-03-23 20:24:58

+1

@TimAbell Все, что я могу сказать, это то, что мы обнаружили, что динамически скомпилированные aspx-страницы (где вам нужно развернуть файлы .cs на реальном сервере) назначали целые числа по-разному для каждого значения. Это означало, что сериализованные объекты на одной машине, десериализуются с разными значениями на другой машине и эффективно становятся поврежденными (вызывая * часовые * путаницы).Мы подняли его с помощью MS, и, похоже, они вспоминают, что они сказали, что автоматически генерируемые целые числа не будут одинаковыми при построении в разных версиях каркаса. 24 мар. 152015-03-24 09:42:39

+1

@TimAbell В отдельном случае разработчик удалил устаревшее/неиспользуемое значение Enum, в результате чего все остальные значения в последовательности выходили на единицу. Таким образом, наши стандарты кодирования теперь требуют, чтобы идентификаторы всегда указывались явно, в противном случае добавление/удаление или даже автоматическое форматирование кода (например, сортировка в алфавитном порядке) изменят все значения, вызывающие повреждение данных. Я бы настоятельно советовал кому-либо прямо указывать целые числа Enum. Это крайне важно, если они коррелируют с хранимыми значениями извне (базы данных). 24 мар. 152015-03-24 09:46:02

  0

Спасибо за информацию @NickG, это действительно очень ценный контекст. Поэтому, если я могу подвести итог: как только что-либо внешнее по отношению к вашей программе имеет знания о целочисленных значениях, любые изменения в них становятся реальной проблемой, и наличие явной нумерации делает последующий обвал менее вероятным. 24 мар. 152015-03-24 13:30:51

  0

Абсолютно. Если вы подозреваете, что по какой-либо причине вам может потребоваться изменить значения перечисления (включая удаление или даже переупорядочение кода). Я просто * всегда * делаю это, потому что нет причин не делать этого. 24 мар. 152015-03-24 13:32:48

+1

Я бы сказал, что «всегда» является излишним (единственное абсолютное правило - абсолюты). Если ваш enum никогда не выходит за пределы вашей программы, вы добавляете незначительные накладные расходы для редактирования списка перечислений, заставляя людей разобраться в том, что сделал бы компилятор для вас. Если вы заботитесь о модификациях, зависит от того, где они используются. ИМХО. 24 мар. 152015-03-24 13:57:34

+1

Получение целочисленного типа boxed ('object') не очень полезно, когда вы не знаете ширину целочисленного типа во время компиляции! Если вы просто хотите записать числовое значение, используйте 'Sides side = Sides.Bottom; Console.WriteLine ("{0: D}", сторона); '. Если вам нужна ссылка на строку, это 'string sideStr = side.ToString (" D ");'. И чтобы ответить на комментарий @MarkLakata, просто используйте 'X' вместо' D', то есть 'Console.WriteLine (« {0: X} », side)' или 'side.ToString (« X »)'. Нижняя строка 'x' дает шестнадцатеричную цифру с нижним регистром' a' через 'f'. 14 окт. 152015-10-14 19:06:55

  0

Это было то, что я искал при создании вспомогательного метода, который преобразует общее перечисление в SelectList +1 03 окт. 172017-10-03 11:12:19


10

Чтобы гарантировать, что значение 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() + "."); 

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

  0

Это было здорово, спасибо Nathon 02 дек. 142014-12-02 17:50:47


10

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

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


152

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

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

+5

Я удивлен, что у этого не было больше голосов - это так очевидно, если вы действительно хотите используйте тип int изначально. 15 май. 132013-05-15 19:40:28

+24

Я бы использовал 'static readonly int', потому что константы были скомпилированы в их жесткие значения. См. Http://stackoverflow.com/a/755693/492 15 май. 132013-05-15 23:16:22

+64

Это решение фактически не дает реальной выгоды от строго типизированных перечислений. Если бы я только хотел передать параметр GameState-enum конкретному методу, например, компилятор не должен позволять мне передавать любую переменную-переменную в качестве параметра. 12 апр. 142014-04-12 18:24:41

+8

@CADBloke, именно поэтому вы должны использовать 'const', а не' static readonly', потому что каждый раз, когда вы сравниваете 'static readonly', вы вызываете вызов метода для получения значения переменной, тогда как с' const' вы ' повторное сравнение двух типов значений. 14 авг. 142014-08-14 17:11:55

+3

@ brettof86 Да, const будет быстрее, если ограничение компиляции никогда не будет проблемой, тогда все будет хорошо. 15 авг. 142014-08-15 10:57:48

  0

@CADbloke Что вы подразумеваете под «компиляцией» здесь? Используете ли вы 'static readonly int', потому что вы динамически загружаете значения из файла настроек или чего-то еще? Я думаю, если вы используете этот статический класс вместо enum, он должен быть 'const', потому что значения не будут меняться. 22 апр. 152015-04-22 14:05:25

+1

@ Zack Я не очень хорошо объяснял это «подстановкой компиляции», я имею в виду, что это значение жестко закодировано, когда вы его компилируете, поэтому любое изменение этого значения потребует, чтобы ** все ** сборки, использующие его, должны были быть перекомпилировать. Я склонен согласиться с вами об использовании, потому что изменение ценностей будет иметь далеко идущие последствия. 22 апр. 152015-04-22 21:53:09

  0

Проблема с этим решением (мы используем его сами) заключается в том, что из подписи метода не будет видно, какие константы использовать, и не будет проверки времени правильной записи. Но кроме этого это работает очень хорошо. 16 мар. 162016-03-16 13:53:20

  0

Я искал альтернативу, но это выглядит как лучший вариант со всей сложностью, как указано в верхних ответах, связанных с преобразованием enum в int. 14 ноя. 162016-11-14 20:59:25

  0

По-моему, этот ответ является лучшим, для скорости разработки и удобочитаемости. Ограничение компиляции, если таковое имеется, полностью стоит того. 09 фев. 172017-02-09 16:29:30

  0

Я использую это в таблице Azure, где перечисления не поддерживаются в любом случае! 05 окт. 172017-10-05 23:49:14

  0

умный!литье каждого перечисления настолько уродливое, чтобы посмотреть на 01 фев. 182018-02-01 02:21:32


6

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

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(); 
+2

Bronek, то, что вы сделали, составляет неинформативный синтаксис с помощью метода расширения (non generic btw), который на самом деле занимает больше времени для записи. Я не вижу, как это лучше оригинального решения Tetraneutron. Давайте не будем делать это в чате, помощь всегда приветствуется в stackoverflow, и все здесь здесь, чтобы помочь. Пожалуйста, воздержитесь от комментариев как конструктивная критика. 10 дек. 122012-12-10 00:28:00

+2

Benjamin, прежде всего, почему вы удалили мой комментарий? Я не понимаю ваших решений - может быть, кто-то другой через сообщество согласится с моим комментарием. Во-вторых, мое решение обертывает Tetraneutron одним и точнее, проще и меньше писать, метод расширения предложен IntelliSense. Поэтому я считаю, что ваше решение не является беспристрастным и представительным. Я вижу много похожих ответов на Stack, и это нормально. В любом случае я использую свое решение, и, возможно, некоторые люди будут выбирать мое решение в будущем, но эти негативные моменты затрудняют поиск. Больше всего это правильно, а не копировать. 10 дек. 122012-12-10 03:20:15

+1

@Bronek Если вы не пинги меня, я не вижу никаких признаков того, что вы ответили. Я не _not_ удаляю ваш комментарий. У меня нет способности или вы хотите этого сделать. Вероятно, пришел мод и удалил его - вы можете отметить его для внимания модератора и спросить, почему или еще лучше, - спросите [meta]. У меня есть мнение о вашем решении с точки зрения программирования, которая совершенно в моих силах - это то, о чем комментарии для начала, нет необходимости воспринимать это лично. 07 авг. 132013-08-07 14:45:58


-13

Попробуйте следующее:

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

1

Самое простое решение, я думаю, перегружает метод 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); 
    } 
} 

15

Я недавно преобразованный от использования перечислений в моем коде в пользу вместо этого используют классы с защищенными конструкторами и предопределенные статические экземпляры (благодаря Roelof - C# Ensure Valid Enum Values - Futureproof Method).

В свете этого ниже я подхожу к этой проблеме (включая неявное преобразование в/из 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) 
    { 
     return question.index; //nb: if question is null this will return a null pointer exception 
    } 

    public static implicit operator Question(int index) 
    { 
     //return values.FirstOrDefault(item => index.Equals(item.index)); 
     Question question; 
     values.TryGetValue(index, out question); 
     return question; 
    } 

    // Easy string conversion (also update ToString for the same effect) 
    public override string ToString() 
    { 
     return this.name; 
    } 

    public static implicit operator string(Question question) 
    { 
     return question == null ? null : question.ToString(); 
    } 

    public static implicit operator Question(string name) 
    { 
     return 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) 
    { 
     return foo; //(implicit conversion will take care of the conversion for you) 
    } 
} 

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

+1

Я думаю, что это компромисс между явным приведением и кодом, который вы должны написать, чтобы обойти его. По-прежнему нравится реализация, просто жаль, что это было не так много. +1 02 авг. 132013-08-02 10:40:29

+1

Я использовал несколько типов классов, структурированных аналогично этому. Я нахожу, что они творят чудеса, пытаясь следовать методологии «Не дай мне быть идиотом позже». 08 сен. 162016-09-08 16:13:08


48

На соответствующую записку, если вы хотите, чтобы получить значение 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); 

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


1

Попробуйте это вместо новообращенного перечисления в целое:

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

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

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

Вы должны привести результат в целое, как так:

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, который удовлетворяет ожиданиям такого типа во многих областях.


4

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

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

И использование немного симпатичнее:

var intValue = Question.Role.IntValue(); 

3
int number = Question.Role.GetHashCode(); 

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


9

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

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

будет приводить:

Name: Role, Value: 2 

8

Может быть, я пропустил его, но кто-нибудь попытался простой общий метод расширения. Это отлично работает для меня. Вы можете избежать применения типа в вашем 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; 
    } 
}  
  0

Возможно, потому что делать (int) customFlag меньше набирает все вокруг и делает более-менее одно и то же? 11 ноя. 142014-11-11 17:32:34


0

Мой любимчик рубить с междунар или меньше перечислений:

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  

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


0

пример, который я хотел бы предложить «чтобы получить„ИНТ“значение из перечисления является»

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

int answer = (int)Sample.Book; 

прямо сейчас ответ будет 1.

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


0

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

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

Private value As Integer = CInt(Question.Role) 

1

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

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

0

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

 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;