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

以下两个类型存在差异,如果直接转是不被允许的,结合反射的知识,我们可以实现该转换要求

public enum GeometryType
{[Description("无")]None,[Description("线")]Line,[Description("点")]Point,[Description("圆")]Circle
}
public enum CustomGeometryType
{[Description("无")]NONE,[Description("点")]POINT,[Description("线")]POLYLINE,
}

核心代码如下:

/// <summary>
/// 根据描述特性转换枚举类型
/// </summary>
static T EnumConvertByDescriptionAttribute<T>(object value) where T : Enum
{if (value == null)return default(T);var type = value.GetType();var field = type.GetField(value.ToString());//获取字段var attri = field.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute;//获取改字段对应的description特性var fields = typeof(T).GetFields(BindingFlags.Public | BindingFlags.Static);//要被赋值的枚举型的所有字段,括号里面的参数可以排除枚举型固有的字段var newField = fields.FirstOrDefault(p => (p.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute)?.Description == attri?.Description);//根据字段的描述去要赋值的枚举型的里面的字段找相同的字段描述if (newField == null)return default(T);T newValue = (T)Enum.Parse(typeof(T), newField.Name);//根据字段的名字转成要赋值的枚举型的类型值return newValue;
}

调用示例:

void Main()
{EnumConvertByDescriptionAttribute<CustomGeometryType>(GeometryType.Line);}

输出结果:

C# 通过反射根据描述特性转换枚举型值相关推荐

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

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

  2. (转)C# Enum,Int,String的互相转换 枚举转换

    (转)C# Enum,Int,String的互相转换 枚举转换 Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来 ...

  3. Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的:()

    例题 (多选)Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的:() A. Java反射主要涉及的类如Class, Method, Fi ...

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

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

  5. C# Enum,Int,String的互相转换 枚举转换

    Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举.注意:枚举类型的基类 ...

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

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

  7. Enum,Int,String的互相转换 枚举转换

    Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...

  8. java反射扫描包,获取枚举属性

    引言 由于现在正在接触的项目是前后端分离,我们自己定义了一些实体类的状态码(意思就是前后台传输成功.失败.或者别的信息,都是用具体的数字代表,有点像HTTP状态码),由于这些东西前台写一份后台写一份会 ...

  9. android手机自带表情符号,android系统自带Emoji表情与表情描述互相转换

    前言 Emoji表情几乎都是有表情描述的,如愤怒的表情会有[愤怒],这样的描述,这里就是举了个列子,至于是什么样的表现形势,这是可以自己定义的.那么这样,一个表情带一个表情描述的好处就是,当我们发送信 ...

最新文章

  1. LeetCode简单题之区域和检索 - 数组不可变
  2. [原创]Bash中的$*和$@的区别
  3. concurrenthashmap 面试题
  4. hdu4549 M斐波那契数列
  5. 英特尔傲腾内存linux,英特尔傲腾内存怎么样?intel傲腾内存优点和缺点你知道吗?...
  6. java textfield类方法_java.awt.TextField类
  7. php异步轮询如何实现,深入剖析JavaScript异步之事件轮询
  8. Fantageek翻译系列之《使用Autolayout显示变化高度的UITableViewCell》
  9. pythonjava哪个好学_Python和Java哪个好学?没基础学python
  10. [渝粤教育] 中国地质大学 职业健康管理体系 复习题
  11. 最新php在线扒站程序源码分享
  12. SourceOffSite Server和Visual SourceSafe 6.0d锁死问题的解决
  13. 亚马逊便携式小空调冷风机英国站UKCA认证测试标准
  14. 计算机装系统找不到硬盘,电脑小白装系统找不到硬盘
  15. 多媒体(流媒体)技术领域及开源系统,媒体库数据如音乐、图片问题等-(图像,音视频)
  16. 逆向js实例---美拍
  17. snubber电路总结
  18. voipdiscount免费拨打全球电话(无需手机注册)
  19. 惊了,深圳房价比北京还高。。。
  20. CCIE知识点总结——组播

热门文章

  1. Java程序员日常开发提效工具(谷歌,Idea)-长期更新
  2. Java基础学习总结(35)——Java正则表达式详解
  3. Linux中TTY是什么意思
  4. Codable实现json转Model,是时候干掉HandyJSON了!
  5. ios -静默方式发送邮件
  6. C语言控制流编程试题,可编程序控制系统设计师(中级)职业认证理论考试试题(含答案).doc...
  7. OllyDbg使用方法
  8. 多属性决策的权重确定方法及matlab 程序
  9. 为什么牛逼程序员都秃顶了....?
  10. matlab弹幕抓取,B站某视频弹幕抓取