枚舉類型大家在平時程序中經常會用到,先看下面的列子
1 enum Orientation 2 { 3 East, 4 South, 5 West, 6 North 7 }
上面代碼定義了一個方向的枚舉類型,包括東、南、西、北四個值,這樣似乎也沒有問題,但是我們是中國人,有時候看中文會更加習慣一些,更重要的是在做數據顯示的時候,利用Enum.GetNames方法也只能獲得像“North”這樣的英文,而得不到理想中的“北”。這種情況,尤其是在數據綁定的時候將十分的麻煩,還需要另外寫代碼將“東、南、西、北”的字符定義出來,再與具體的枚舉值關聯起來。
為了解決這個問題,可以直接將值的字符串定義成中文,如下所示。
1 enum Orientation 2 { 3 東, 4 南, 5 西, 6 北 7 }
這樣,通過Enum.GetNames方法就可以獲得“東、南、西、北”這樣的字符了。但是這樣的編碼也太違背編碼習慣了,畢竟中文字符變量讓人看起來十分的別扭。如何解決這個問題呢?答案就是使用Attribute!下面就是示例代碼。
1 enum Orientation 2 { 3 [DescriptionAttribute("東")] 4 East, 5 [DescriptionAttribute("南")] 6 South, 7 [DescriptionAttribute("西")] 8 West, 9 [DescriptionAttribute("北")] 10 North 11 }
但又如何獲取DescriptionAttribute的內容呢?呵呵,答案就是通過反射。下面是我封裝獲取DescriptionAttribute內容的擴展方法。
1 static string GetDescription<T>(this T value) 2 { 3 var memInfo = value.GetType().GetMember(value.ToString()); 4 var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false).Cast<DescriptionAttribute>(); 5 if (attributes.Any()) 6 return attributes.First().Description; 7 return string.Empty; 8 }
下面就是測試的代碼以及測試結果
1 static class Program 2 { 3 enum Orientation 4 { 5 [DescriptionAttribute("東")] 6 East, 7 [DescriptionAttribute("南")] 8 South, 9 [DescriptionAttribute("西")] 10 West, 11 [DescriptionAttribute("北")] 12 North 13 } 14 static string GetDescription<T>(this T value) 15 { 16 var memInfo = value.GetType().GetMember(value.ToString()); 17 var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false).Cast<DescriptionAttribute>(); 18 if (attributes.Any()) 19 return attributes.First().Description; 20 return string.Empty; 21 } 22 static void Main() 23 { 24 foreach (var s in Enum.GetValues(typeof(Orientation))) 25 { 26 Console.WriteLine("值:{0}\t\t說明:{1}",s.ToString(),s.GetDescription()); 27 } 28 } 29 }
從輸出可以看出,程序成功的獲取了枚舉值的說明內容,這樣就可以利用這種模式方便的對枚舉值添加中文說明,然后在需要的時候提取出來,如:需要做數據綁定的時候。