Enum String Name из Value

407

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

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

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

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

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

Ответы:

542

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

int value = GetValueFromDb();
var enumDisplayStatus = (EnumDisplayStatus)value;
string stringValue = enumDisplayStatus.ToString();
Кент Бугаарт
источник
13
Обновление: только определенные перегрузки, использующие IFormatProvider, являются устаревшими. ToString () в порядке. См. Groups.google.com/group/DotNetDevelopment/browse_thread/thread/…
AndyM
Какое поведение в случае enum Foo { A = 1, B= 1 }?
ДБКК
3
В документации @dbkk говорится, что в отношении перечислений «ваш код не должен делать никаких предположений о том, какая строка будет возвращена». из-за конкретной ситуации, которую вы цитируете. см. msdn.microsoft.com/en-us/library/16c1xs4z.aspx
Пол Д'Амбра
4
Устаревшее решение: msdn.microsoft.com/en-us/library/…
Джек,
4
короче: var stringValue = ((EnumDisplayStatus) значение) .ToString ()
redwards510
188

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

int dbValue = GetDBValue();
string stringValue = Enum.GetName(typeof(EnumDisplayStatus), dbValue);
algreat
источник
5
Если в ответе Мандолина есть неточность: Enum.GetName возвращает строку, а не Enum
algreat
Использует ли это отражение или компилятор создает вспомогательный словарь для использования за кулисами?
Palswim
155

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

string m = Enum.GetName(typeof(MyEnumClass), value);
Mandoleen
источник
@nilco этот ответ хорош, но я предпочитаю ответ Кента, главным образом потому, что у меня есть свой атрибут в моих перечислениях «Описание». Затем у меня есть расширение перечисления, чтобы получить описание - это для отображения на экране для пользователя.
Хараг
60

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

string bob = nameof(EnumDisplayStatus.Visible);
Джеймс Кук
источник
9
C # 6+ требуется, хотя.
Адам К Дин
10
@AZChad это здорово знать, конечно; но это на самом деле не применимо в сценарии OP, так как значения поступают из базы данных (так: значения времени выполнения, а не времени компиляции)
Марк Грэвелл
22

ты можешь просто разыграть это

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

ах .. кент победил меня в этом :)

Спасли
источник
Теперь Кент получает всю репутацию «первого ответа». Хороший один Кент! : p
Matt Kocaj
12

DB в C #

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

C # в БД

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

источник
12

РЕШЕНИЕ:

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
Навин Кумар V
источник
2
Это копия 7-летнего ответа. Можете ли вы объяснить, почему ваш лучше, чем оригинал?
nvoigt
@nvoigt Потому что, если я прав, API-интерфейс ToString () в Enum устарел. [ docs.microsoft.com/en-us/dotnet/api/…
Навин Кумар V
Итак ... по крайней мере два других ответа уже содержат код, который вы разместили. Что вы предоставляете по сравнению с Mandoleen или Algreat?
nvoigt
@nvoigt Они не упомянули о его производительности по сравнению с явным приведением. Достаточно ли вам, чтобы вам понравился мой ответ? : p В любом случае спасибо, надеюсь, это кому-нибудь поможет. :)
Навин Кумар V
Кажется, у нас проблемы со связью. Вы используете мобильное устройство или, возможно, не прокрутили достаточно далеко? Есть две точные копии вашего ответа от 7 лет назад. Я назвал ответчиков, чтобы их было легко найти. Что дает ваш ответ, которого не было здесь по крайней мере 7 лет?
nvoigt
9

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

Возвращает литерал перечисления.

public enum MyEnum {
    CSV,
    Excel
}


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

Замечания:

  • Вы не хотели бы называть перечисление в верхнем регистре, но использовали для демонстрации чувствительности к регистру nameof.
пожинать
источник
Это должен был быть ответ.
поклонник LinPy
@LinPyfan Рад, что это работает хорошо! Это относительно новый по сравнению с датой ОП.
пожинать
4

Нужно:

string stringName = EnumDisplayStatus.Visible.ToString("f");
// stringName == "Visible"
Al3x_M
источник
1
в большинстве случаев это в значительной степени совпадает с основным ответом от 10 лет назад; добавление "f"спецификатора является нюансом, и может или не может быть то, что хочет вызывающий (это зависит от: что они хотят): docs.microsoft.com/en-us/dotnet/standard/base-types/…
Марк
Я не обращал внимания на свидание ахах. Я думаю, что это хорошо, чтобы обновить старое решение, как это. Я не буду последним, кто откроет эту страницу. И спасибо за вашу точность! :)
Al3x_M
3

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

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

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

string stringValue = $"{enumDisplayStatus:D}";
SetDBValue(Convert.ToInt32(stringValue ));
Мухаммед Акиб
источник
Почему не просто .ToString ()? 'Facepalm'
MeTitus
3

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

 CustomerType = ((EnumCustomerType)(cus.CustomerType)).ToString()
Biddut
источник
1

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

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
lacop
источник