有時咱們會用玫舉定義協議,使用枚舉的好處是讓代碼更加清晰,由於它能夠描述特定的值,固然對程序員是如此,稍微看下就明白了,若是要你對非技術作運維,甚至連運維都不是的人,若是你單單告訴他程序員
某某設備此時返回的命令碼是多少多少!此時不只是體驗用戶懵了,甚至代碼隔的久了,你也會這樣說,稍等下我查下文檔,不用說,你要是作出這樣的效果,客戶不滿意,上級不滿意,更準確來講你也不滿意了!運維
假如咱們定義這樣一個枚舉,字面意思是懂了,如咱們單單說數字1對這個枚舉來講,數字1就表明中午。ide
1 public enum TimeofDay:uint 2 { 3 Morning, 4 Afternoon, 5 Evening 6 } ;
但若是用一個枚舉定義的是一個協議,那麼這樣就是不夠的,咱們還須要獲取枚舉變量的文字描述。從新修訂下這個枚舉,咱們讓他加上註釋,讓他變成以下這樣ui
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 };
那麼怎麼獲取TimeOfDay.Morning 表明的意思呢,接下來就是本文想要表述的。主要思想也是用到反射獲取它的文字描述。分三步進行,spa
第一步:定義一個枚舉,因上面定義描述過了,在此再也不重複code
第二步:先判斷枚舉裏面有沒有定義這個常量,這是很正常的,總不能沒有你變個有出來吧blog
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 }
第三步:爲變得通用,需把怎麼獲取枚舉的文字描述單獨抽出來ip
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 }