• 开发中巧用Enum枚举类型


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


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

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

    但是我习惯于用一个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
  • 相关阅读:
    vmware 上安装 gentoo
    有关网络编程
    【记录】Linux API钩子-文件打开
    在linux上实现DllMain + 共享库创建方法
    让程序在指定路径寻找库文件 + 库文件搜索顺序
    自定义协议解析
    修改bashrc,如何立即刷新
    Autoconf学习笔记
    ps命令输出,进程状态
    npm 使用 taobao 的镜像后,无法 login & publish
  • 原文地址:https://www.cnblogs.com/liufei88866/p/2241168.html
Copyright © 2020-2023  润新知