程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Enum是如何用的?

Enum是如何用的?

編輯:C#入門知識

對於枚舉Enum,大家都非常熟悉,但枚舉出現的場景非常多的時候,是不是可以抽象出一個通用的解決方式。代碼大家都會寫,但並不是所有人都喜歡寫重復的代碼,老是用Ctrl+C和Ctrl+V累不累啊?很多人和我一樣,非常不喜歡寫重復的代碼,代碼寫多了,BUG就多。對於常見的場景,大部分人都喜歡抽象出來,寫一套通用的,每個地方都可以用,而且不易出錯。當然,你喜歡Ctrl+C和Ctrl+V,本人也沒有辦法....

如下,一個簡單枚舉:

     , = = 

對於以下輸入代碼:

            ExchangeType type = (ExchangeType) (type ==  (type ==

對於強制轉換,大家猜猜看,會輸出什麼....

對於結果,大家可以自己去測試下,有可能與你期望的值不一致!

同樣對於以下代碼:

 success = Enum.TryParse<ExchangeType>(,   type);

TryParse執行的返回結果success也是成功的(為true),但期望值也不一定正確。

因此,對於枚舉轉換來說,還是很容易出錯的。所以,必須提供默認的值來確保轉換失敗時,返回正確的值。對於int值和string值轉換成Enum的代碼如下:

          T ToEnum<T>( value, T defaultT)  T :  enumName = Enum.GetName( ToEnum<T>  T ToEnum<T>( enumName, T defaultT)  T :  ( (!Enum.TryParse<T>(enumName.Trim(),  (Enum.IsDefined(


另外還提供了其他應用的方法,如將包含類型名稱前綴的字符串ExchangeType.All轉換成枚舉,同樣需要提供默認值來確保轉換結果的准確性,代碼如下:

          T TryParse<T>( typeValue, T defaultValue,  containsTypeName = )  T : = (typeValue ??  startIndex = typeValue.IndexOf( (startIndex >  && typeValue.Length > startIndex + = typeValue.Substring(startIndex +  ToEnum<T>

應用的話,比較簡單,ExchangeType type = EnumFieldProvider.TryParse<ExchangeType>("ExchangeType.", ExchangeType.All, true);

對於下拉列表中,很多場景與枚舉有關,硬編碼也可以直接綁定。但是枚舉很多的時候是不是得寫很多代碼,而且並不一定保證代碼的正確性。與其這樣,那就寫一個通用的吧,大家都輕松:

          (type ==  [] customAttributes = type.GetCustomAttributes((EnumFieldAttribute), =  ( attr = attr  (attribute !=    IList<EnumItem<T>> GetItems<T>( isSpecialRequired = )  T :  fields = (T).GetFields(BindingFlags.Static | (fields ==  || fields.Count() ==   List<EnumItem<T>> enumItems =  List<EnumItem<T>>=  ( field [] customAttributes = field.GetCustomAttributes((EnumFieldAttribute),  ( attr = attr  (attribute !=  (!= (T)field.GetValue( EnumItem<T>  IList<EnumItem<T>> GetItems<T>(IList<T> entities)  T :  (entities ==  || entities.Count() ==   List<EnumItem<T>> enumItems =  List<EnumItem<T>> ( entity <T>   GetItemDescription<T>(T enumItem)  T :  field =  (field ==  [] customAttributes = field.GetCustomAttributes((EnumFieldAttribute),  ( attr = attr  (attribute !=    EnumItem<T> GetItem<T>(T enumItem)  T :  field =  (field ==   EnumItem<T>[] customAttributes = field.GetCustomAttributes((EnumFieldAttribute),  ( attr = attr  (attribute !=   EnumItem<T>  EnumItem<T>

對於方法public static IList<EnumItem<T>> GetItems<T>(bool isSpecialRequired = false) where T : struct,提供一個參數來篩選是否需要該參數,如以上定義的枚舉類型ExchangeType中的 EnumFieldAttribute("不限", true),其中EnumFieldAttribute("不限", true)第二個參數與isSpecialRequired參數一致。
測試代碼如下:

 <EnumItem<ExchangeType>> actual = EnumFieldProvider.GetItems<ExchangeType>( <EnumItem<ExchangeType>> actual = EnumFieldProvider.GetItems<ExchangeType>

返回的結果可以用於下拉列表,ListBox等相關控件值的綁定與顯示(由於明天還得上班,本文不提供,下篇隨筆提供)。

對於細節方面,還是需要花時間和精力來總結的。用得多了,自然也就懂了,洗洗睡覺了...

今天又是7月1號,又是一個紀念日。4年前,6月26號畢業聯歡晚會後,哥開始正式工作的第一天也是7月1號。一轉眼,4年過去了,人生如戲...

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved