开发者社区> mcy247> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

将不确定变为确定~Flag特性的枚举是否可以得到Description信息

简介:
+关注继续查看

之前我写过对于普通枚举类型对象,输出Description特性信息的方法,今天主要来说一下,如何实现位域Flags枚举元素的Description信息的方法。

对于一个普通枚举对象,它输出描述信息是这样的

   public enum Status
    {
        [Description("正常")]
        Normal = -1,
        [Description("删除")]
        Deletet = 0,
        [Description("冻结")]
        Freezed = 1,
    }
   Status status = Status.Normal;
   Console.WriteLine(status.GetDescription());

而对于支持位域Flags特性的枚举来说,在使用GetDescription方法时,是不能实现的,我们需要对它进行一些改造。

   [Flags]
    public enum Ball
    {

        [Description("足球")]
        FootBall = 1,
        [Description("篮球")]
        BasketBall = 2,
        [Description("乒乓球")]
        PingPang = 4,
    }
    /// <summary>
    /// 枚举类型扩展方法
    /// </summary>
    public static class EnumExtensions
    {
        /// <summary>
        /// 得到Flags特性的枚举的集合
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        static List<Enum> GetEnumValuesFromFlagsEnum(Enum value)
        {
            List<Enum> values = Enum.GetValues(value.GetType()).Cast<Enum>().ToList();
            List<Enum> res = new List<Enum>();
            foreach (var itemValue in values)
            {
                if ((value.GetHashCode() & itemValue.GetHashCode()) != 0)
                    res.Add(itemValue);
            }
            return res;
        }

        /// <summary>  
        /// 获取枚举变量值的 Description 属性  
        /// </summary>  
        /// <param name="obj">枚举变量</param>  
        /// <returns>如果包含 Description 属性,则返回 Description 属性的值,否则返回枚举变量值的名称</returns>  
        public static string GetDescription(this Enum obj)
        {
            string description = string.Empty;
            try
            {
                Type _enumType = obj.GetType();
                DescriptionAttribute dna = null;
                FieldInfo fi = null;
                var fields = _enumType.GetCustomAttributesData();

                if (!fields.Where(i => i.Constructor.DeclaringType.Name == "FlagsAttribute").Any())
                {
                    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;
                    return null;
                }

                GetEnumValuesFromFlagsEnum(obj).ToList().ForEach(i =>
                {
                    fi = _enumType.GetField(Enum.GetName(_enumType, i));
                    dna = (DescriptionAttribute)Attribute.GetCustomAttribute(fi, typeof(DescriptionAttribute));
                    if (dna != null && string.IsNullOrEmpty(dna.Description) == false)
                        description += dna.Description + ",";
                });

                return description.EndsWith(",")
                    ? description.Remove(description.LastIndexOf(','))
                    : description;
            }
            catch
            {
                throw;
            }

        }
    }

它在赋值后,输出是这样的

 Ball ball = Ball.BasketBall | Ball.FootBall;
 Console.WriteLine(ball.GetDescription());

本文转自博客园张占岭(仓储大叔)的博客,原文链接:将不确定变为确定~Flag特性的枚举是否可以得到Description信息,如需转载请自行联系原博主。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
typescript72-已有的类型声明文件(第三方库的类型文件)
typescript72-已有的类型声明文件(第三方库的类型文件)
18 0
使用阿里云ECS,快速搭建、管理VuePress静态网站
使用阿里云ECS,快速搭建、管理VuePress静态网站
226 0
字节码实战--手写一个btrace
简易的btrace需求 偶现的方法执行慢,我们是可以用jstack捕捉到的,但是慢到什么地步却是不一定知道的,现在就需要在不重启应用的情况下,获取方法执行的时间。
1162 0
计算机中的概念: 视图 VS 镜像
这两个概念还是不太一样的。下面来说说个人的理解,记录一下。 1. 镜像 镜像可以理解为一份完全一样的拷贝。也就是"深度拷贝",一个复制品。 比如 iso映像文件,ubuntu-12.04.5-desktop-amd64.iso 比如 数据的多副本,用于多副本容灾、或者应对高峰读取。
977 0
EasyUI DataGrid根据字段动态合并单元格
1.合并方法 /*** EasyUI DataGrid根据字段动态合并单元格* 参数 tableID 要合并table的id* 参数 colList 要合并的列,用逗号分隔(例如:"name,department,office");*/function mergeCellsByField(tableID, colList) {    var ColArray = colList.
1006 0
DNN中的Unit Test
需要解决的问题: 如何从一个Asp.net的Unit Test转换 如何处理数据库访问的问题 参考文章: 这一篇比较有用:Unit testing DotNetNuke projects just became easier Unit Testing a DotNetNuke Private...
662 0
+关注
mcy247
做自己的太阳 无需凭借谁的光
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载