開發中巧用Enum枚舉類型

在實際開發中,在數據庫表設計中,咱們每每習慣於用一個Int類型的State字段去表示數據的狀態,這個字段很方便去表示這條數據的狀態,可是又不肯意去建一張這個State字段的外鍵表去解釋狀態。(這一類型表狀態的字段可能還會有不少,這裏只是舉個例)數據庫

 

咱們通常會把這個State字段當成一個約定,去在項目中應用(好比:0:啓用,1:禁用)spa

在後臺管理或其它地方顯示Int類型對應的實際狀態時,再到公共類中去寫一個方法,裏面用一個switch...case去返回對應的中文解釋。設計

 


 http://www.dtan.socode

可是我習慣於用一個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
相關文章
相關標籤/搜索