在實際開發中,在數據庫表設計中,咱們每每習慣於用一個Int類型的State字段去表示數據的狀態,這個字段很方便去表示這條數據的狀態,可是又不肯意去建一張這個State字段的外鍵表去解釋狀態。(這一類型表狀態的字段可能還會有不少,這裏只是舉個例)數據庫
咱們通常會把這個State字段當成一個約定,去在項目中應用(好比:0:啓用,1:禁用)spa
在後臺管理或其它地方顯示Int類型對應的實際狀態時,再到公共類中去寫一個方法,裏面用一個switch...case去返回對應的中文解釋。設計
可是我習慣於用一個Enum枚舉去規範數據庫去全部的State字段,Enum的使用,也更利於開發,能夠分別對枚舉註釋,約定能夠呈如今開發人員眼前,而不是直接憑空約定。下面分享一下我對Enum類的使用。component
1.首先,咱們能夠對枚舉類型創建一個實體類:ReadEnumblog
public class ReadEnum { public string Name { get; set; } public int Value { get; set; } }
2.第二步,建立State字段對應的枚舉ip
#region##狀態枚舉(數據庫裏全部State枚舉) ///<summary> /// 狀態枚舉(數據庫裏全部State枚舉) /// 建立人:Porschev /// 建立時間:2011-7-19 ///</summary> public enum ssnState { ///<summary> /// 啓用 ///</summary> [Description("啓用")] Enabled = 0, ///<summary> /// 禁用 ///</summary> [Description("禁用")] Disable = 1 } #endregion
如上面建立的枚舉,開發者在使用枚舉時通常都不會用到紅色部分Description屬性,它在System.ComponentModel命名空間下開發
有了它,咱們徹底能夠不用之前使用的switch...case方法去釋義或顯示中文。get
第三步:對全部Enum寫一些應用方法string
#region##得到Enum類型description ///<summary> /// 得到Enum類型description /// 建立時間:2011-7-19 ///</summary> ///<param name="enumType">枚舉的類型</param> ///<param name="val">枚舉值</param> ///<returns>string</returns> public static string GetEnumDesc(Type enumType, object val) { string enumvalue = System.Enum.GetName(enumType, val); if (string.IsNullOrEmpty(enumvalue)) { return ""; } System.Reflection.FieldInfo finfo = enumType.GetField(enumvalue); object[] enumAttr = finfo.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), true); if (enumAttr.Length > 0) { System.ComponentModel.DescriptionAttribute desc = enumAttr[0] as System.ComponentModel.DescriptionAttribute; if (desc != null) { return desc.Description; } } return enumvalue; } #endregion #region##獲取某個枚舉的所有信息 ///<summary> /// 獲取某個枚舉的所有信息 /// 建立時間:2011-7-19 ///</summary> ///<typeparam name="T">枚舉</typeparam> ///<returns>枚舉的所有信息</returns> public static List<ReadEnum> GetEnumList<T>() { List<ReadEnum> list = new List<ReadEnum>(); ReadEnum re = null; Type type = typeof(T); foreach (int enu in System.Enum.GetValues(typeof(T))) { re = new ReadEnum(); re.Name = GetEnumDesc(type, enu); re.Value = enu; list.Add(re); } return list; } #endregion #region##根據值返回枚舉對應的內容 ///<summary> /// 根據值返回枚舉對應的內容 /// 建立時間:2011-7-19 ///</summary> ///<typeparam name="T">枚舉</typeparam> ///<param name="value">值(int)</param> ///<returns></returns> public static T GetModel<T>(int value) { T myEnum = (T)System.Enum.Parse(typeof(T), value.ToString(), true); return myEnum; } #endregion #region##根據值返回枚舉對應的內容 ///<summary> /// 根據值返回枚舉對應的內容 /// 建立時間:2011-7-19 ///</summary> ///<typeparam name="T">枚舉</typeparam> ///<param name="value">值(string)</param> ///<returns></returns> public static T GetModel<T>(string value) { T myEnum = (T)System.Enum.Parse(typeof(T), value, true); return myEnum; } #endregion
這幾個方法徹底能夠知足在項目中對Enum枚舉的使用。
第四步:測式代碼
string str = GetEnumDesc(typeof(ssnState), 0); //結果:啓用 List<ReadEnum> list = GetEnumList<ssnState>(); //結果:list.Count=2 // 第一個元素:Name:啓用;Value:0 // 第二個元素:Name:禁用;Value:1 ssnState re = GetModel<ssnState>(0); //結果:ssnState.Enabled ssnState re1 = GetModel<ssnState>("0"); //結果:ssnState.Enabled