• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#获取枚举值描述信息的方法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在项目开发中我们经常会用枚举,一般情况下我们为枚举定义了一些类型在使用的时候都要根据枚举的值来判断,我们可以利用  Attribute 来实现。

在定义枚举的时候增加描述属性:

/// <summary>
/// 定义接口请求状态枚举。
/// </summary>
public enum StatusCode
{
    /// <summary>
    /// 操作成功。
    /// </summary>
    [EnumDescription("操作成功")]
    Success = 1,
 
    /// <summary>
    /// 操作失败。
    /// </summary>
    [EnumDescription("操作失败")]
    Error = 0
}

EnumDescriptionAttribute 定义如下:

    /// <summary>
    /// 枚举描述属性,使用 EnumDescriptionAttribute 以透明获取的枚举值描述信息。
    /// </summary>
    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
    public class EnumDescriptionAttribute : Attribute
    {
        #region Fields...

        /// <summary>
        /// 初始化枚举值描述文本缓存。
        /// </summary>
        private static Dictionary<string, string> dic = new Dictionary<string, string>();

        #endregion

        #region Properties...

        /// <summary>
        /// 获取或设置枚举值描述文本。
        /// </summary>
        public string Description{ get; set; }

        #endregion

        #region Methods...

        /// <summary>
        /// 获取指定枚举值的描述文本。
        /// </summary>
        /// <param name="enumValue">指定枚举值。</param>
        /// <returns>指定枚举值的描述文本。</returns>
        public virtual string GetDescription(object enumValue)
        {
            if (enumValue != null)
            {
                return Description ?? enumValue.ToString();
            }
            else
            {
                return String.Empty;
            }
        }

        /// <summary>
        /// 获取指定枚举值的描述文本。
        /// </summary>
        /// <param name="enumValue">指定枚举值。</param>
        /// <returns>指定枚举值的描述文本。</returns>
        public static string GetDescription(Enum enumValue)
        {
            //获取指定枚举值的枚举类型。
            Type type = enumValue.GetType();

            string key = GetCacheKey(type, enumValue.ToString());
            //如果缓存存在,直接返回缓存的枚举值描述文本。
            if (dic.ContainsKey(key))
            {
                return dic[key];
            }

            FieldInfo fieldInfo = type.GetField(enumValue.ToString());
            if (fieldInfo != null)
            {
                //获得枚举中各个字段的定义数组
                var atts = (EnumDescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(EnumDescriptionAttribute), false);
                if (atts.Length > 0)
                {
                    dic[key] = atts[0].Description;
                    return atts[0].Description;
                }
            }
            return enumValue.ToString();

        }

        /// <summary>
        /// 以得到指定枚举类型的所有枚举值的由 EnumDescriptionAttribute 或其继承类标注的描述信息
        /// </summary>
        /// <param name="enumType"></param>
        /// <param name="enumIntValue"></param>
        /// <returns></returns>
        public static string GetDescription(Type enumType, int enumIntValue)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            Dictionary<int, string> descs = EnumDescriptionAttribute.GetDescriptions(enumType);
            Dictionary<int, string>.Enumerator en = descs.GetEnumerator();
            while (en.MoveNext())
            {
                if ((enumIntValue & en.Current.Key) == en.Current.Key)
                {
                    if (sb.Length == 0)
                    {
                        sb.Append(en.Current.Value);
                    }
                    else
                    {
                        sb.Append(',');
                        sb.Append(en.Current.Value);
                    }
                }
            }

            return sb.ToString();
        }

        public static Dictionary<int, string> GetDescriptions(Type enumType)
        {
            Dictionary<int, string> descs = new Dictionary<int, string>();

            if (enumType != null && enumType.IsEnum)
            {
                FieldInfo[] fields = enumType.GetFields();

                for (int i = 1; i < fields.Length; ++i)
                {
                    object fieldValue = Enum.Parse(enumType, fields[i].Name);
                    object[] attrs = fields[i].GetCustomAttributes(true);
                    bool findAttr = false;
                    foreach (object attr in attrs)
                    {
                        if (typeof(EnumDescriptionAttribute).IsAssignableFrom(attr.GetType()))
                        {
                            descs.Add((int)fieldValue, ((EnumDescriptionAttribute)attr).GetDescription(fieldValue));
                            findAttr = true;
                            break;
                        }
                    }
                    if (!findAttr)
                    {
                        descs.Add((int)fieldValue, fieldValue.ToString());
                    }
                }
            }

            return descs;
        }

        #region Private Methods...

        /// <summary>
        /// 获取指定枚举值描述文本缓存键。
        /// </summary>
        /// <param name="type">指定枚举类型。</param>
        /// <param name="enumStrValue">指定枚举值字符串。</param>
        /// <returns>指定枚举值描述文本缓存键。</returns>
        private static string GetCacheKey(Type type, string enumStrValue)
        {
            return type.ToString() + "_" + enumStrValue;
        }

        #endregion

        #endregion
    }

在使用的时候只需要调用 GetDescription 方法即可。

EnumDescriptionAttribute.GetDescription(StatusCode.Success)

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap