Имя строки перечисления из значения

У меня есть такая конструкция перечисления:

public enum EnumDisplayStatus
{
    None    = 1,
    Visible = 2,
    Hidden  = 3,
    MarkedForDeletion = 4
}

В моей базе данных на перечисления ссылаются по значению. Мой вопрос: как я могу вернуть числовое представление перечисления к имени строки.

Например, для 2 результат должен быть Visible.

Я считаю, что теперь есть более простой способ сделать это с помощью VS 2015 nameof(EnumDisplayStatus.Visible). Надеюсь, это кому-то поможет.

Gabriel Marius Popescu 23.05.2017 12:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
454
1
584 698
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Ответ принят как подходящий

Вы можете преобразовать int обратно в член перечисления с помощью простого преобразования, а затем вызвать ToString():

int value = GetValueFromDb();
var enumDisplayStatus = (EnumDisplayStatus)value;
string stringValue = enumDisplayStatus.ToString();

Обновление: устарели только определенные перегрузки, использующие IFormatProvider. ToString () в порядке. См. groups.google.com/group/DotNetDevelopment/browse_thread/thre‌ ad /…

AndyM 15.04.2009 13:37

Каково поведение в случае enum Foo { A = 1, B= 1 }?

dbkk 05.07.2011 10:26

@dbkk в документации говорится, что в отношении перечислений «ваш код не должен делать никаких предположений о том, какая строка будет возвращена». из-за точной ситуации, которую вы цитируете. см. msdn.microsoft.com/en-us/library/16c1xs4z.aspx

Paul D'Ambra 25.07.2011 16:41

Обновленное решение: msdn.microsoft.com/en-us/library/…

Jack 18.07.2014 05:13

короче: var stringValue = ((EnumDisplayStatus) значение) .ToString ()

redwards510 12.01.2017 21:17

Я не говорю, что это не работает, просто говорю, что ответ @Mandoleen работает с 1/3 кода.

Blair Connolly 18.10.2017 19:05

@BlairConnolly: Потому что между двумя ответами разница в 4 года :)

curiousBoy 14.02.2018 04:09

@curiousBoy, конечно, но это не делает мой комментарий ложным. Я считаю, что ответ Мандолин более полезен в наши дни и, вероятно, поможет большему количеству людей, если он появится до принятого ответа.

Blair Connolly 16.02.2018 23:32

ты можешь просто бросить это

int dbValue = 2;
EnumDisplayStatus enumValue = (EnumDisplayStatus)dbValue;
string stringName = enumValue.ToString(); //Visible

ах .. Кент меня опередил :)

Просто приведите int к типу перечисления:

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();

DB в C#

EnumDisplayStatus status = (EnumDisplayStatus)int.Parse(GetValueFromDb());

C# в БД

string dbStatus = ((int)status).ToString();

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

string m = Enum.GetName(typeof(MyEnumClass), value);

@nilco, этот ответ хорош, но я предпочитаю ответ Кента, в основном потому, что у меня есть настраиваемый атрибут в моих перечислениях «Описание». Затем у меня есть расширение перечисления, чтобы получить описание - это для отображения на экране для пользователя.

Harag 12.04.2018 18:10

Если вам нужно получить строку "Visible" без получения экземпляра EnumDisplayStatus, вы можете сделать это:

int dbValue = GetDBValue();
string stringValue = Enum.GetName(typeof(EnumDisplayStatus), dbValue);

Если вы о ответе Мандолин, есть неточность: Enum.GetName возвращает строку, а не Enum

algreat 09.06.2013 18:10

Использует ли это отражение или компилятор создает вспомогательный словарь для использования за кулисами?

palswim 11.03.2019 22:48

Использовать это:

string bob = nameof(EnumDisplayStatus.Visible);

Однако требуется C# 6+.

Adam K Dean 17.07.2018 21:32

@AZChad, конечно, это отличная вещь; но это не В самом деле применяется в сценарии OP, поскольку значения поступают из базы данных (так: время выполнения, а не время компиляции, значения)

Marc Gravell 29.11.2018 15:52

Нужно:

string stringName = EnumDisplayStatus.Visible.ToString("f");
// stringName == "Visible"

в большинстве случаев это почти идентично главному ответу 10-летней давности; добавление спецификатора "f" имеет нюансы и может быть, а может и не быть тем, что хочет вызывающий (это зависит от: чего они хотят): docs.microsoft.com/en-us/dotnet/standard/base-types/…

Marc Gravell 29.11.2018 15:50

Я не обратил внимания на дату ахах. Я думаю, что неплохо бы немного обновить старое решение, подобное этому. Я не буду последним, кто откроет эту страницу. И спасибо за точность! :)

Al3x_M 29.11.2018 19:39

РЕШЕНИЕ:

int enumValue = 2; // The value for which you want to get string 
string enumName = Enum.GetName(typeof(EnumDisplayStatus), enumValue);

Кроме того, использование GetName лучше, чем Явное приведение Enum.

[Код для оценки производительности]

Stopwatch sw = new Stopwatch (); sw.Start (); sw.Stop (); sw.Reset ();
double sum = 0;
int n = 1000;
Console.WriteLine ("\nGetName method way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = Enum.GetName (typeof (Roles), roleValue);
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Getname method casting way: {sum / n}");
Console.WriteLine ("\nExplicit casting way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = ((Roles)roleValue).ToString ();
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Explicit casting way: {sum / n}");

[Пример результата]

GetName method way:
Average of 1000 runs using Getname method casting way: 0.000186899999999998
Explicit casting way:
Average of 1000 runs using Explicit casting way: 0.000627900000000002

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

nvoigt 22.02.2019 12:20

@nvoigt Потому что, если я прав, API ToString () в Enum теперь устарел. [docs.microsoft.com/en-us/dotnet/api/…

Naveen Kumar V 22.02.2019 13:02

Итак ... как минимум два других ответа уже содержат опубликованный вами код. Что у вас есть по сравнению с Mandoleen или другим?

nvoigt 22.02.2019 13:44

@nvoigt Про его производительность по сравнению с Explicit casting не упомянули. Этого достаточно, чтобы тебе понравился мой ответ? : p В любом случае спасибо, надеюсь, это кому-то поможет. :)

Naveen Kumar V 22.02.2019 14:00

Похоже, у нас проблемы со связью. Вы используете мобильное устройство или, может быть, вы недостаточно прокрутили страницу вниз? Есть две точные копии вашего ответа семилетней давности. Я назвал ответчиков, чтобы их было легко найти. Что, по вашему мнению, не было здесь уже как минимум 7 лет?

nvoigt 22.02.2019 16:35

Для получения строкового значения [Имя]:

EnumDisplayStatus enumDisplayStatus = (EnumDisplayStatus)GetDBValue();
string stringValue = $"{enumDisplayStatus:G}"; 

И для получения значения перечисления:

string stringValue = $"{enumDisplayStatus:D}";
SetDBValue(Convert.ToInt32(stringValue ));

Почему не просто .ToString ()? "фейспалм"

MeTitus 02.01.2020 12:44

я использовал этот код, приведенный ниже

 CustomerType = ((EnumCustomerType)(cus.CustomerType)).ToString()

Самое быстрое решение во время компиляции с использованием nameofвыражение.

Возвращает регистр буквального типа перечисления или, в других случаях, class, struct или любой из variable (arg, param, local и т. д.).

public enum MyEnum {
    CSV,
    Excel
}


string enumAsString = nameof(MyEnum.CSV)
// enumAsString = "CSV"

Примечание:

  • Вы не захотите называть перечисление полностью прописными, но оно используется для демонстрации чувствительности к регистру nameof.

Это должен был быть ответ.

LinPy fan 06.05.2020 15:41

@LinPyfan Рад, что все работает хорошо! Это относительно ново по сравнению с датой OP.

Reap 08.05.2020 22:05

Другие вопросы по теме