zoukankan      html  css  js  c++  java
  • 如何为枚举类型添加说明

    如何为枚举类型添加说明

     

    枚举类型大家在平时程序中经常会用到,先看下面的列子

    复制代码
    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}		说明:{1}",s.ToString(),s.GetDescription());
    27             }
    28         }        
    29     }
    复制代码

    从输出可以看出,程序成功的获取了枚举值的说明内容,这样就可以利用这种模式方便的对枚举值添加中文说明,然后在需要的时候提取出来,如:需要做数据绑定的时候。

     
     
     
    标签: c#枚举类型
  • 相关阅读:
    Openjudge-NOI题库-简单算术表达式求值
    洛谷-求同构数的个数-NOIP2013提高组复赛
    洛谷-拼数-NOIP1998提高组复赛
    洛谷-统计数字-NOIP2007提高组复赛
    洛谷-谁拿了最多奖学金-NOIP2005提高组复赛
    Openjudge-NOI题库-字符串移位包含问题
    洛谷-乘积最大-NOIP2000提高组复赛
    NOIP2015-普及组复赛-第一题-金币
    Tyvj-超级书架
    Openjudge-NOI题库-出书最多
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3261385.html
Copyright © 2011-2022 走看看