如何為枚舉類型添加說明


枚舉類型大家在平時程序中經常會用到,先看下面的列子

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     }

 

從輸出可以看出,程序成功的獲取了枚舉值的說明內容,這樣就可以利用這種模式方便的對枚舉值添加中文說明,然后在需要的時候提取出來,如:需要做數據綁定的時候。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM