回到目录

之前我写过对于普通枚举类型对象,输出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());

回到目录

转载于:https://www.cnblogs.com/lori/archive/2013/04/28/3048801.html

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

  1. 获取枚举值上的Description特性说明

    /// <summary> /// 获取枚举值上的Description特性说明 /// </summary> /// <typeparam name="T&q ...

  2. C# 通过反射根据描述特性转换枚举型值

    假设我有两个枚举型,其中里面的字段并不一致,而且顺序也不一致,所以无法通过现有的转换方式转换,如果字段不一致,但是描述一致的话,我们可以通过反射获取两个枚举型各自的字段的描述特性,从而实现两个类型直接 ...

  3. 在java中关于枚举类型的特性_java枚举类型小结

    JDK5.0之前,我们一般选择使用 interface 来保存常量组,以此来弥补 JDK 中没有枚举类型的缺陷,从JDK5.0开始,Sun引进了一个全新的关键字 enum 来定义一个枚举类.同inte ...

  4. 现代C++新特性 强枚举类型(PC浏览效果更佳)

    文字版PDF文档链接:现代C++新特性(文字版)-C++文档类资源-CSDN下载 1. 枚举类型的弊 C++之父本贾尼·斯特劳斯特卢普曾经在他的The Design And Evolution Of ...

  5. 3.1_28_4 JDK8新特性【Date】之ZoneId 时区信息

    相关链接 Excel目录 JavaSE-JDK8新特性 P1 [Lambda表达式] JavaSE-JDK8新特性 P2 [Stream流]操作集合 JavaSE-JDK8新特性 P3 [Option ...

  6. dotty编译器语法特性之一枚举类型

    2019独角兽企业重金招聘Python工程师标准>>> 一个枚举是用来定义一个类型,这个类型是命名值类型的集合. 翻译: http://dotty.epfl.ch/docs/refe ...

  7. C# 枚举在项目中的应用总结

    本文主要是我在实际项目中对C#枚举的应用总结,如果存在不足的地方欢迎您指出. 一.枚举基本运用 1.枚举其实可以理解为一个恒量的结合,又或者可以认为它是一种类型.比如以下枚举定义:   public ...

  8. Python2寿命只剩一个月啦!还不快赶紧学起Python3酷炫到爆的新特性!

    作者: Lateautumn4lin  来源:云爬虫技术研究笔记 Python3.8已经发布了将近一个月了,距离Python3.0第一个版本发布也将超过10年了.相信很多人还是依旧在使用Python2 ...

  9. C# 枚举特性 FlagAttribute 的应用

    写在前面 枚举Enum 全称(Enumeration),即一种由一组称为枚举数列表的命名常量组成的独特类型.可以看出枚举的出现是为了使我们可以在程序中方便的使用一些特定值的常量,一般的使用大家都比较熟 ...

最新文章

  1. 基于二代和三代测序技术的柚子基因组混合拼装
  2. html文字随机变色效果,html肿么让字体得到随机颜色
  3. admui3字体无法删除_被微信好友删除、拉黑还不知?这3个方法可以自查,看完涨知识了...
  4. BZOJ1406: [AHOI2007]密码箱 数论
  5. 51Nod 1314 定位系统
  6. NYOJ516(优化)
  7. 【WEB API项目实战干货系列】- 接口文档与在线测试(二)
  8. mysql数据库中删除数据用什么语句_mysql数据库删除数据语句
  9. 在控制台打印半径为R的圆
  10. 查找丢包故障点的一个好命令:pathping
  11. ff7重制版青魔法_最终幻想7重制版蒂法全服装获取攻略
  12. 2022-2028全球及中国薪酬管理系统行业研究及十四五规划分析报告
  13. div内li标签间距_css怎样让li间距增大?
  14. ChatGPT会砸了谷歌的饭碗吗?(附彩蛋)
  15. H3C交换机型号区分
  16. 【Office】新建的EXCEL打不开,而存在的EXCEL能打开
  17. 怎么制作一张5M以上的大图片
  18. Java流程控制之do....while 循环的详解,看完你就会
  19. java 使用subList痛彻心扉的领悟
  20. android http 网关,安卓平台上实现基于HTTP协议数据网关的方法

热门文章

  1. 服务器端开发经验总结 Linux C语言
  2. linux的strace命令
  3. 在C#.net中如何操作XML
  4. web标准的投资回报
  5. 在ASP.NET中获取文件属性
  6. 使用多线程还是用IO复用select/epoll? epoll 或者 kqueue 的原理是什么?
  7. memset函数使用详解
  8. 一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现2
  9. Windows上通过VLC播放器搭建rtsp流媒体测试地址操作步骤
  10. 【Qt】Ubuntu下Qt应用程序自启动设置