對於枚舉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年過去了,人生如戲...