开发中巧用Enum枚举类型

来源:互联网 发布:java 代码加密 编辑:程序博客网 时间:2024/06/16 13:24

 

在实际开发中,在数据库表设计中,我们往往习惯于用一个Int类型的State字段去表示数据的状态,这个字段很方便去表示这条数据的状态,但是又不愿意去建一张这个State字段的外键表去解释状态。

 

我们一般会把这个State字段当成一个约定,去在项目中应用(比如:0:启用,1:禁用)

在后台管理或其它地方显示Int类型对应的实际状态时,再到公共类中去写一个方法,里面用一个switch...case去返回对应的中文解释。

  http://www.dtan.so

但是我习惯于用一个Enum枚举去规范数据库去所有的State字段,Enum的使用,也更利于开发,可以分别对枚举注释,约定可以呈现在开发人员眼前,而不是直接凭空约定。下面分享一下我对Enum类的使用。

 

1.首先,我们可以对枚举类型建立一个实体类:ReadEnum

public class ReadEnum    {        public string Name { get; set; }        public int Value { get; set; }    }


2.第二步,创建State字段对应的枚举

#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方法去释义或显示中文。

 

第三步:对所有Enum写一些应用方法

#region##获得Enum类型description        /// <summary>        /// 获得Enum类型description        /// 创建人:Porschev        /// 创建时间: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>        /// 获取某个枚举的全部信息        /// 创建人:Porschev        /// 创建时间: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>        /// 根据值返回枚举对应的内容        /// 创建人:Porschev        /// 创建时间: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>        /// 根据值返回枚举对应的内容        /// 创建人:Porschev        /// 创建时间: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


 

原创粉丝点击