欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

枚举类型帮助类 EnumHelper

程序员文章站 2022-06-02 22:43:40
...
项目中出现的问题:
项目中会有很多地方用到文字提醒,如果在每个页面都输入相同的文字,后期修改就比较麻烦。


延伸:如果是写api接口不仅要有提示,还得附带错误code值,不同业务类型,code值也应该有差异化


解决思路:
将所有的文字提醒写在一个枚举类型中,通过对枚举类型来管理。
好处:相同的提醒只需更改一次,项目中所有用到的地方都可以更改过来




方法:
首先新建枚举类
/// <summary>
    /// api 响应状态吗
    /// </summary>
    public enum ResultCode
    {
        /// <summary>
        /// 操作成功
        /// </summary>
        [Description("成功")]
        Success = 10000,

        /// <summary>
        ///系统繁忙,请稍后再试
        /// </summary>
        [Description("系统繁忙,请稍后再试")]
        Faild = 10001,

        /// <summary>
        /// 登陆时效已过,请重新登录
        /// </summary>
        [Description("登录时效已过,请重新登录")]
        CustomerTokenError = 10002,

        /// <summary>
        /// 用户不存在
        /// </summary>
        [Description("用户不存在")]
        CustomerNotExist = 20001,

        /// <summary>
        /// 密码不能少于6位
        /// </summary>
        [Description("密码不能少于6位")]
        PasswordIsShort = 20002,


        /// <summary>
        /// 没有数据
        /// </summary>
        [Description("没有数据")]
        NoData = 30001,

        /// <summary>
        /// 没有更多数据
        /// </summary>
        [Description("没有更多数据")]
        NoMoreData = 30002,
    }


    /// <summary>
    /// api 响应实体
    /// </summary>
    public class ResponseResult
    {

        //public string Status { get; set; }
        /// <summary>
        /// 响应状态码
        /// </summary>
        public int Code { get; set; }

        /// <summary>
        /// 响应消息
        /// </summary>
        public string Message { get; set; }
        /// <summary>
        /// 响应时间
        /// </summary>
        public string Time { get; set; }
        /// <summary>
        /// 返回数据
        /// </summary>
        public dynamic Result { get; set; }

        /// <summary>
        /// 根据枚举类型,返回错误代码
        /// </summary>
        /// <param name="code">返回响应码状态枚举</param>
        /// <returns>ResponseResult类</returns>
        public static ResponseResult GenFaildResponse(ResultCode code = ResultCode.Faild)
        {
            return new ResponseResult 
            { 
                Code = (int)code, 
                Message = code.GetDescription(),
                Time = DateTime.Now.ToString() 
            };
        }

        /// <summary>
        /// 执行失败,code:10001,返回错误的data
        /// </summary>
        /// <param name="data">data</param>
        /// <returns></returns>
        public static ResponseResult GenFaildResponse(dynamic data)
        {
            return new ResponseResult
            {
                Code = (int)ResultCode.Faild,
                Message = ResultCode.Faild.GetDescription(),
                Time = DateTime.Now.ToString(),
                Result = data
            };
        }

        /// <summary>
        /// 返回执行失败消息,code:10001 msg=参数
        /// </summary>
        /// <param name="msg">错误消息</param>
        /// <returns>API响应实体</returns>
        public static ResponseResult GenFaildResponse(string msg)
        {
            return new ResponseResult
            {
                Code = (int)ResultCode.Faild,
                Message = msg,
                Time = DateTime.Now.ToString()
            };
        }

        /// <summary>
        /// 执行成功后,返回code:10000 描述:执行成功及数据data
        /// </summary>
        /// <param name="data">要返回的数据,可以为空</param>
        /// <returns>API响应实体</returns>
        public static ResponseResult GenSuccessResponse(dynamic data = null)
        {
            return new ResponseResult 
            { 
                Code = (int)ResultCode.Success, 
                Message = ResultCode.Success.GetDescription(), 
                Time = DateTime.Now.ToString(),
                Result = data 
            };
        }
    }


其次需要一个枚举帮助类,帮我们读取描述文件
public static class EnumHelper
    {
        /// <summary>
        /// 获取枚举变量值的 Description 属性
        /// </summary>
        /// <param name="obj">枚举变量</param>
        /// <returns>如果包含 Description 属性,则返回 Description 属性的值,否则返回枚举变量值的名称</returns>
        public static string GetDescription(this Enum obj)
        {
            return GetDescription(obj, false);
        }

        /// <summary>
        /// 获取枚举变量值的 Description 属性
        /// </summary>
        /// <param name="obj">枚举变量</param>
        /// <param name="isTop">是否改变为返回该类、枚举类型的头 Description 属性,而不是当前的属性或枚举变量值的 Description 属性</param>
        /// <returns>如果包含 Description 属性,则返回 Description 属性的值,否则返回枚举变量值的名称</returns>
        public static string GetDescription(this Enum obj, bool isTop)
        {
            if (obj == null)
            {
                return string.Empty;
            }
            try
            {
                Type _enumType = obj.GetType();
                DescriptionAttribute dna = null;
                if (isTop)
                {
                    dna = (DescriptionAttribute)Attribute.GetCustomAttribute(_enumType, typeof(DescriptionAttribute));
                }
                else
                {
                    FieldInfo fi = _enumType.GetField(Enum.GetName(_enumType, obj));
                    dna = (DescriptionAttribute)Attribute.GetCustomAttribute(
                       fi, typeof(DescriptionAttribute));
                }
                if (dna != null && string.IsNullOrEmpty(dna.Description) == false)
                    return dna.Description;
            }
            catch
            {
            }
            return obj.ToString();
        }
    }



这样就方便管理了,如果有更好的方法,欢迎大家分享,共同进步