2015-11-25 2 views
0

Мне нужно перечисление вернуть отформатированную строку в представлении, например:Как мне преобразовать Enum?

public enum status 
{ 
    NotStarted, 
    InProgress, 
} 

возвращение: Not Started и In Progress. Как я это делаю? Спасибо (язык C#)

+1

Посмотрите здесь: http://stackoverflow.com/questions/479410/enum-tostring-with-user-friendly-strings – mshsayem

+0

Я только добавил свой [ answer] (http://stackoverflow.com/questions/479410/enum-tostring-with-user-friendly-strings/33921043#33921043) к связанному вопросу, что является хорошим примером [Humanizer] (https: // github. com/Humanizr/Humanizer). –

ответ

2

перечисления не делаем это. Вам нужно будет предоставить карту значений перечисления для отображения строк, или вы можете сделать что-то вроде определения атрибута с помощью отображаемой строки, которую вы можете использовать (что требует некоторого неудобного отражения для получения атрибута для заданного значения перечисления, но имеет преимущество в том, что вы можете определить отображаемое имя прямо там, где вы определяете значение перечисления).

Например, вы можете использовать Dictionary<status,string> для их отображения:

var myMap = new Dictionary<status,string>() 
{ 
    { status.NotStarted, "Not Started" }, 
    { status.InProgress, "In Progress" } 
}; 

Теперь, чтобы получить отображаемую строку для заданного значения состояния s вы бы просто сделать что-то вроде:

var s = status.NotStarted; 
var displayString = myMap[s]; // "Not Started" 

Конечно, вы помещаете это в класс где-то, поэтому он определяется только один раз в одном месте.

Другой довольно хрупкий, быстрый и грязный способ сделать это будет заключаться в том, чтобы использовать имена переименования Pascal и использовать что-то вроде регулярного выражения, чтобы взять имя перечисления и вставить дополнительное пространство. Но это довольно хаки. Таким образом, вы могли бы сделать что-то вроде:

var r = new Regex("([A-Z][a-z]*)([A-Z][a-z]*)"); 
var displayString = r.Replace(s.ToString(),"$1 $2"); // "Not Started" 

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

0

Вызов ToString на значении emum является эквивалентом Enum.GetName, который даст вам именованного значение т.е.

Console.WriteLine(status.NotStarted.ToString()) // NotStarted 

Оттуда, если предположить, что формат соответствует, вы можете преобразовать строку из Паскаля корпуса на пробельный разделенная строка, например

string result = Regex.Replace(status.NotStarted, "([a-z])([A-Z])", "$1 $2"); 
Console.WriteLine(result); // Not Started 

See example.

0
Enum.GetName(typeof (Status), Status.InProgress)); 
Смежные вопросы