枚举还有这样的用法你知道吗

Posted jeremylin-hu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了枚举还有这样的用法你知道吗相关的知识,希望对你有一定的参考价值。

  有时我们会用玫举定义协议,使用枚举的好处是让代码更加清晰,因为它可以描述特定的值,当然对程序员是如此,稍微看下就明白了,如果要你对非技术做运维,甚至连运维都不是的人,如果你单单告诉他

某某设备此时返回的命令码是多少多少!此时不仅是体验用户懵了,甚至代码隔的久了,你也会这样说,稍等下我查下文档,不用说,你要是做出这样的效果,客户不满意,上级不满意,更准确来说你也不满意了!

  假如我们定义这样一个枚举,字面意思是懂了,如我们单单说数字1对这个枚举来说,数字1就代表中午。

       

技术分享图片
1 public enum TimeofDay:uint
2 {
3     Morning,
4     Afternoon,
5     Evening
6  } ;
View Code 1

  但如果用一个枚举定义的是一个协议,那么这样就是不够的,我们还需要获取枚举变量的文字描述。重新修订下这个枚举,我们让他加上注释,让他变成如下这样

  

技术分享图片
 1 public enum TimeofDay 
 2 {
 3         /// <summary>
 4         /// 未定义
 5         /// </summary>
 6         None,
 7         /// <summary>
 8         /// 早上
 9         /// </summary>
10         Morning = 1,
11         /// <summary>
12         /// 下午
13         /// </summary>
14         Afternoon = 3,
15         /// <summary>
16         /// 晚上
17         /// </summary>
18         Evening = 4
19 
20 };
View Code2

 

  那么怎么获取TimeOfDay.Morning 代表的意思呢,接下来就是本文想要表述的。主要思想也是用到反射获取它的文字描述。分三步进行,

  第一步:定义一个枚举,因上面定义描述过了,在此不再重复

  第二步:先判断枚举里面有没有定义这个常量,这是很正常的,总不能没有你变个有出来吧

  

技术分享图片
 1 /// <summary>
 2 /// 先要判断枚举有没有这个定义,再决定是否进行下一步
 3  /// </summary>
 4 /// <param name="intCmd">命令码</param>
 5 /// <returns>返回值符串</returns>
 6 private string GetDescription(int intCmd)
 7 {
 8        string strReturn = string.Empty;
 9        TimeofDay day = TimeofDay.None;
10         if (Enum.IsDefined(typeof(TimeofDay), intCmd))
11         {
12                 day = (TimeofDay)intCmd;
13                 strReturn = GetEnumDescription(day);
14                 return strReturn;
15          }
16 
17         return strReturn;
18 }
View Code3

   第三步:为变得通用,需把怎么获取枚举的文字描述单独抽出来

      

技术分享图片
 1 /// <summary>
 2 /// 获取枚举的Description 特性
 3 /// </summary>
 4 /// <param name="value">枚举值</param>
 5 /// <returns>描述</returns>
 6 public static string GetEnumDescription(Enum value)
 7 {
 8         System.Reflection.FieldInfo fi =     
 9                  value.GetType().GetField(value.ToString());
10          DescriptionAttribute[] attributes =
11                  (DescriptionAttribute[])fi.GetCustomAttributes(
12                   typeof(DescriptionAttribute), false);
13          return (attributes.Length > 0) ? attributes[0].Description : value.ToString();
14 
15 }
View Code4

 

以上是关于枚举还有这样的用法你知道吗的主要内容,如果未能解决你的问题,请参考以下文章

有人知道下面的代码片段是啥意思吗?

Java中枚举的写法和用法

错误的枚举用法

关于delphi枚举类型的调用的问题?谢谢大家

这种用法不正确吗?

roslyn能生成枚举吗?