相关文章推荐
淡定的梨子  ·  Python学习笔记第四十一天(NumPy ...·  2 年前    · 
眼睛小的野马  ·  浅谈Singularity容器_男孩李的博客 ...·  2 年前    · 
从容的橡皮擦  ·  Azure 容器应用中的网络环境 | ...·  2 年前    · 
火星上的鸡蛋  ·  Unity AssetBundle介绍 - 掘金·  2 年前    · 
高大的猕猴桃  ·  javascript - How do I ...·  2 年前    · 
Code  ›  开发中巧用Enum枚举类型开发者社区
string list enum 枚举类型
https://cloud.tencent.com/developer/article/1020773
帅气的佛珠
2 年前
作者头像
Porschev
0 篇文章

开发中巧用Enum枚举类型

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > Porschev[钟慰]的专栏 > 正文

开发中巧用Enum枚举类型

发布 于 2018-01-16 11:37:17
597 0
举报

在实际开发中,在 数据库 表设计中,我们往往习惯于用一个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
 
推荐文章
淡定的梨子  ·  Python学习笔记第四十一天(NumPy 位运算)-阿里云开发者社区
2 年前
眼睛小的野马  ·  浅谈Singularity容器_男孩李的博客-CSDN博客
2 年前
从容的橡皮擦  ·  Azure 容器应用中的网络环境 | Microsoft Learn
2 年前
火星上的鸡蛋  ·  Unity AssetBundle介绍 - 掘金
2 年前
高大的猕猴桃  ·  javascript - How do I fix "Expected to return a value at the end of arrow function" warning? - Stack Overflow
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号