Мое перечисление состоит из следующих значений:
private enum PublishStatusses{
NotCompleted,
Completed,
Error
};
Я хочу иметь возможность выводить эти значения в удобной для пользователя форме, хотя.
Мне не нужно снова переходить от строки к значению.
Ответы:
Я использую
Description
атрибут из пространства имен System.ComponentModel. Просто украсьте перечисление:Затем используйте этот код, чтобы получить его:
источник
ArgumentException
, тогда нет причин для того, чтобы метод был полностью универсальным.Я делаю это с помощью методов расширения:
источник
default
реализации case возвращатьme.ToString()
и предоставлять операторы switch только для значений enum, которые вы хотите переопределить. В вашем примере я получаю, что все они разные, но в реальных случаях использования я подозреваю, что большинство значений перечисления из одного слова будет достаточно, и вы будете предоставлять переопределения только для значений из нескольких слов перечисления.Может быть, я что-то упустил, но что не так с Enum.GetName?
edit: для удобных для пользователя строк вам нужно пройти через .resource, чтобы выполнить интернационализацию / локализацию, и, возможно, было бы лучше использовать фиксированный ключ, основанный на ключе enum, чем атрибут decorator для того же.
источник
Я создал метод обратного расширения, чтобы преобразовать описание обратно в значение перечисления:
источник
Самым простым решением здесь является использование пользовательского метода расширения (по крайней мере, в .NET 3.5 - вы можете просто преобразовать его в статический вспомогательный метод для более ранних версий фреймворка).
Здесь я предполагаю, что вы хотите вернуть что-то кроме фактического имени значения перечисления (которое вы можете получить, просто вызвав ToString).
источник
Этот другой пост - Java. Вы не можете поместить методы в Enums в C #.
просто сделайте что-то вроде этого:
Если вы хотите использовать различные отображаемые значения для значений перечисления, вы можете использовать Атрибуты и Отражение.
источник
Самый простой способ - просто включить этот класс расширения в ваш проект, он будет работать с любым перечислением в проекте:
Использование:
...
источник
string result = "Result: " + ee;
Некоторые другие более примитивные опции, которые избегают классов / ссылочных типов:
Метод массива
использование
Метод вложенных структур
использование
Обновление (03/09/2018)
Гибрид методов расширения и первый метод выше.
Я предпочитаю, чтобы перечисления определялись там, где они «принадлежат» (ближе к источнику происхождения, а не в каком-то общем глобальном пространстве имен).
Метод расширения кажется подходящим для общей области, и «локализованное» определение перечисления теперь делает метод расширения более многословным.
Пример использования перечисления и его метода расширения.
Примечание: я на самом деле решил исключить
Enum
оболочку (иName
массив), так как лучше, чтобы строки имен исходили из ресурса (т.е. файла конфигурации или БД), а не были жестко запрограммированы, и потому что я в конечном итоге поместил метод расширения вViewModels
пространство имен (просто в другом файле "CommonVM.cs"). Плюс все.Id
это становится отвлекающим и громоздким.CommonVM.cs
Пример использования перечисления и его метода расширения.
источник
Вы можете использовать HUMANIZER пакет с гуманизацией Enums Possiblity. Пример:
тогда вы можете
Humanize
напрямую использовать метод расширения для enum:источник
Что касается Ray Booysen, в коде есть ошибка: Enum ToString с удобными для пользователя строками
Вам необходимо учитывать несколько атрибутов в значениях перечисления.
источник
источник
this
параметр в методах расширения, который вы можете увидетьThis
во многих примерах в Интернете. Называя его как его тип как вы (Enum Enum
), вы делаете код менее читабельным.Вместо использования перечисления используйте статический класс.
замещать
с участием
это будет использоваться так
Проблема с использованием лучших «методов расширения» решения:
Частное перечисление часто используется внутри другого класса. Решение метода расширения там недопустимо, поскольку оно должно быть в своем собственном классе. Это решение может быть закрытым и встроенным в другой класс.
источник
Я являюсь поклонником VB.NET, так что вот моя версия, сочетающая метод DescriptionAttribute с методом расширения. Во-первых, результаты:
Основные вещи: перечисление с именем EnumType с тремя значениями V1, V2 и V3. «Волшебство» происходит в вызове Console.WriteLine в Sub Main (), где последний аргумент - просто
v.Description
. Это возвращает «Один» для V1, «V2» для V2 и «Три» для V3. Этот Description-метод на самом деле является методом расширения, определенным в другом модуле EnumExtensions:Поскольку поиск атрибутов описания с использованием
Reflection
медленен, поиск также кэшируется в частном порядкеDictionary
, который заполняется по требованию.(Извините за решение VB.NET - должно быть относительно просто перевести его на C #, а мой C # ржавеет по новым темам, таким как расширения)
источник
Очистите резюме вышеупомянутых предложений с образцом:
ИСПОЛЬЗОВАНИЕ:
источник
Используйте Enum.GetName
Из приведенной выше ссылки ...
источник
Согласно этой документации: https://docs.microsoft.com/pt-br/dotnet/api/system.enum.tostring?view=netframework-4.8
Можно просто преобразовать перечислитель в строку, используя такой формат:
Вы можете увидеть все возможные форматы по этой ссылке: https://docs.microsoft.com/pt-br/dotnet/api/system.string?view=netframework-4.8
источник
Это обновление кода Рэя Бойзена, в котором используется общий метод GetCustomAttributes и LINQ для упрощения работы.
источник
Еще чище резюме:
Такое же использование, как подчеркивание.
источник
Для флагов enum в том числе.
источник
Если вы просто хотите добавить пробел между словами, это так же просто, как
источник
Я использую универсальный класс для хранения пар enum / description и вложенный вспомогательный класс для получения описания.
Перечисление :
Общий класс:
Примечание: Поскольку универсальный класс не может быть ограничен перечислением, я ограничиваюсь структурой и проверяю перечисление в конструкторе.
Использование:
источник
Я думаю, что лучший (и самый простой) способ решить вашу проблему - написать Extension-Method для вашего перечисления:
источник
Если вы хотите что-то полностью настраиваемое, попробуйте мое решение здесь:
http://www.kevinwilliampang.com/post/Mapping-Enums-To-Strings-and-Strings-to-Enums-in-NET.aspx
По сути, в посте описывается, как прикреплять атрибуты Description к каждому из перечислений, и предоставляется общий способ сопоставления перечисления с описанием.
источник