枚举类型大家在平时程序中经常会用到,先看下面的列子
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 }
从输出可以看出,程序成功的获取了枚举值的说明内容,这样就可以利用这种模式方便的对枚举值添加中文说明,然后在需要的时候提取出来,如:需要做数据绑定的时候。