У меня есть такая конструкция перечисления:
public enum EnumDisplayStatus
{
None = 1,
Visible = 2,
Hidden = 3,
MarkedForDeletion = 4
}
В моей базе данных на перечисления ссылаются по значению. Мой вопрос: как я могу вернуть числовое представление перечисления к имени строки.
Например, для 2 результат должен быть Visible.





Вы можете преобразовать int обратно в член перечисления с помощью простого преобразования, а затем вызвать ToString():
int value = GetValueFromDb();
var enumDisplayStatus = (EnumDisplayStatus)value;
string stringValue = enumDisplayStatus.ToString();
Обновление: устарели только определенные перегрузки, использующие IFormatProvider. ToString () в порядке. См. groups.google.com/group/DotNetDevelopment/browse_thread/thre ad /…
Каково поведение в случае enum Foo { A = 1, B= 1 }?
@dbkk в документации говорится, что в отношении перечислений «ваш код не должен делать никаких предположений о том, какая строка будет возвращена». из-за точной ситуации, которую вы цитируете. см. msdn.microsoft.com/en-us/library/16c1xs4z.aspx
Обновленное решение: msdn.microsoft.com/en-us/library/…
короче: var stringValue = ((EnumDisplayStatus) значение) .ToString ()
Я не говорю, что это не работает, просто говорю, что ответ @Mandoleen работает с 1/3 кода.
@BlairConnolly: Потому что между двумя ответами разница в 4 года :)
@curiousBoy, конечно, но это не делает мой комментарий ложным. Я считаю, что ответ Мандолин более полезен в наши дни и, вероятно, поможет большему количеству людей, если он появится до принятого ответа.
ты можешь просто бросить это
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, этот ответ хорош, но я предпочитаю ответ Кента, в основном потому, что у меня есть настраиваемый атрибут в моих перечислениях «Описание». Затем у меня есть расширение перечисления, чтобы получить описание - это для отображения на экране для пользователя.
Если вам нужно получить строку "Visible" без получения экземпляра EnumDisplayStatus, вы можете сделать это:
int dbValue = GetDBValue();
string stringValue = Enum.GetName(typeof(EnumDisplayStatus), dbValue);
Если вы о ответе Мандолин, есть неточность: Enum.GetName возвращает строку, а не Enum
Использует ли это отражение или компилятор создает вспомогательный словарь для использования за кулисами?
Использовать это:
string bob = nameof(EnumDisplayStatus.Visible);
Однако требуется C# 6+.
@AZChad, конечно, это отличная вещь; но это не В самом деле применяется в сценарии OP, поскольку значения поступают из базы данных (так: время выполнения, а не время компиляции, значения)
Нужно:
string stringName = EnumDisplayStatus.Visible.ToString("f");
// stringName == "Visible"
в большинстве случаев это почти идентично главному ответу 10-летней давности; добавление спецификатора "f" имеет нюансы и может быть, а может и не быть тем, что хочет вызывающий (это зависит от: чего они хотят): docs.microsoft.com/en-us/dotnet/standard/base-types/…
Я не обратил внимания на дату ахах. Я думаю, что неплохо бы немного обновить старое решение, подобное этому. Я не буду последним, кто откроет эту страницу. И спасибо за точность! :)
РЕШЕНИЕ:
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 Потому что, если я прав, API ToString () в Enum теперь устарел. [docs.microsoft.com/en-us/dotnet/api/…
Итак ... как минимум два других ответа уже содержат опубликованный вами код. Что у вас есть по сравнению с Mandoleen или другим?
@nvoigt Про его производительность по сравнению с Explicit casting не упомянули. Этого достаточно, чтобы тебе понравился мой ответ? : p В любом случае спасибо, надеюсь, это кому-то поможет. :)
Похоже, у нас проблемы со связью. Вы используете мобильное устройство или, может быть, вы недостаточно прокрутили страницу вниз? Есть две точные копии вашего ответа семилетней давности. Я назвал ответчиков, чтобы их было легко найти. Что, по вашему мнению, не было здесь уже как минимум 7 лет?
Для получения строкового значения [Имя]:
EnumDisplayStatus enumDisplayStatus = (EnumDisplayStatus)GetDBValue();
string stringValue = $"{enumDisplayStatus:G}";
И для получения значения перечисления:
string stringValue = $"{enumDisplayStatus:D}";
SetDBValue(Convert.ToInt32(stringValue ));
Почему не просто .ToString ()? "фейспалм"
я использовал этот код, приведенный ниже
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.Это должен был быть ответ.
@LinPyfan Рад, что все работает хорошо! Это относительно ново по сравнению с датой OP.
Я считаю, что теперь есть более простой способ сделать это с помощью VS 2015
nameof(EnumDisplayStatus.Visible). Надеюсь, это кому-то поможет.