2015-11-25 51 views
0

我需要我的枚舉格式化字符串返回視圖,例如:如何格式化Enum?

​​

回報:Not StartedIn Progress。我怎麼做?謝謝(語言C#)

+1

看看這裏:http://stackoverflow.com/questions/479410/enum-tostring-with-user-friendly-strings – mshsayem

+0

我剛剛加入我的[回答](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

上emum值調用ToString是相當於Enum.GetName這將使你的命名值即

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

從那裏,假設的格式是一致的,你可以將字符串從Pascal大小寫轉換成空白分隔字符串,例如

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));