C#通过反射进行枚举描述相关操作

C#可以通过反射,来获取枚举的描述信息或通过描述信息获取到指定类型的枚举

 1 /// <summary>
 2 /// 获取枚举描述
 3 /// </summary>
 4 /// <param name="enumName"></param>
 5 /// <returns></returns>
 6 public static string GetDescription(this Enum enumName)
 7 {
 8     string description;
 9     FieldInfo fieldInfo = enumName.GetType().GetField(enumName.ToString());
10     DescriptionAttribute[] attributes = fieldInfo.GetDescriptAttr();
11     if (attributes != null && attributes.Length > 0)
12         description = attributes[0].Description;
13     else
14         throw new ArgumentException($"{enumName} 未能找到对应的枚举描述.", nameof(enumName));
15     return description;
16 }
17
18 /// <summary>
19 /// 获取枚举描述属性
20 /// </summary>
21 /// <param name="fieldInfo"></param>
22 /// <returns></returns>
23 private static DescriptionAttribute[] GetDescriptAttr(this FieldInfo fieldInfo)
24 {
25     return (DescriptionAttribute[])fieldInfo?.GetCustomAttributes(typeof(DescriptionAttribute), false);
26 }
27
28 /// <summary>
29 /// 通过描述获取枚举值
30 /// </summary>
31 /// <typeparam name="TEnum"></typeparam>
32 /// <param name="description"></param>
33 /// <returns></returns>
34 public static TEnum GetEnum<TEnum>(string description)
35 {
36     Type type = typeof(TEnum);
37     foreach (FieldInfo field in type.GetFields())
38     {
39         DescriptionAttribute[] curDesc = field.GetDescriptAttr();
40         if (curDesc != null && curDesc.Length > 0)
41         {
42             if (curDesc[0].Description == description)
43                 return (TEnum)field.GetValue(null);
44         }
45         else
46         {
47             if (field.Name == description)
48                 return (TEnum)field.GetValue(null);
49         }
50     }
51     throw new ArgumentException($"{description} 未能找到对应的枚举.", nameof(description));
52 }
时间: 2024-11-29 03:31:53

C#通过反射进行枚举描述相关操作的相关文章

转 sqlserver字段描述相关操作sql

可以自己查询系统表: SELECT o.name AS tableName, c.name AS columnName, p.[value] AS Description FROM sysproperties p INNER JOIN sysobjects o ON o.id = p.id INNER JOIN syscolumns c ON p.id = c.id AND p.smallid = c.colid WHERE (p.name = 'MS_Description') ORDER B

(二十四)linux新定时器:timefd及相关操作函数

timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #include <sys/timerfd.h> int timerfd_create(int clockid, int flags); int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itim

linux下进程相关操作

一.定义和理解 狭义定义:进程是正在运行的程序的实例. 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动. 进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间,一般情况下,包括文本区域.数据区域和堆栈区域.文本区域存储处理器执行的代码:数据区域存储变量和进程执行期间使用的动态分配的内存:堆栈区域存储着活动过程调用的指令和本地变量. 第二,进程是一个“执行中的程序”.程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们

职责链模式+策略模式+反射+配置文件,完美实现下机操作(一)

纵观机房收费系统,逻辑最复杂的也就是下机操作了,这几天一直在考虑下机操作该如何进行. 流程分析: 判断卡号是否存在与是否上机 上机时间的处理 根据时间计算消费金额 更新余额,添加记录 关于逻辑的操作主要集中在两个计算上面时间和金额.首先说上机时间的处理问题,做之前我看了下第一版机房收费系统关于下机的操作: '计算消费时间 TxtTime.Text =DateDiff("n", Trim(TxtOntime.Text), Trim(Offtime)) TxtTime.Text = Txt

从零自学Hadoop(21):HBase数据模型相关操作下

阅读目录 序 变量 数据模型操作 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 上一篇,我们讲述了HBase的数据模型相关操作的上部分.   下面我们开始介绍HBase的数据模型相关操作的下部分. 变量 一:定义变量 这样我们就可以使用t这个变量来代替table1了. t=get_table 'table1' 二:使用 t.put 'row1','cf1:a','v1' t.g

关于C#资源文件的相关操作

关于资源文件的相关操作. //1.比较常见的有获取资源文件对应的文件流,然后转换到相对应的文件 //比较典型的做法是通过代码程序集加载指定资源 //如下通过Assembly的静态方法GetExecutingAssembly()得到程序集 //还有很多方式可以得到代码程序集 System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); Stream manifestResourceStream

Scala详解---------数组相关操作

Scala中提供了一种数据结构-数组,其中存储相同类型的元素的固定大小的连续集合.数组用于存储数据的集合,但它往往是更加有用认为数组作为相同类型的变量的集合. 取替声明单个变量,如number0, number1, ..., 和number99,声明一个数组变量,如号码和使用numbers[0],numbers[1],...,numbers[99]表示单个变量.本教程介绍了如何声明数组变量,创建数组和使用索引的过程变量数组.数组的第一个元素的索引是数字0和最后一个元素的索引为元素的总数减去1.

Message Flood --set相关操作

Message Flood Time Limit: 1500ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Well, how do you feel about mobile phone? Your answer would probably be something like that "It's so convenient and benefits people a lot". However, If you ask Merlin this

u-boot串口和stdio、console初始化及相关操作详解&lt;三&gt;

console是构建在stdio之上的,console的初始化是board_r中最后收尾的操作. console的初始化函数console_init_r在common/console.c中实现: int console_init_r(void) { char *stdinname, *stdoutname, *stderrname; struct stdio_dev *inputdev = NULL, *outputdev = NULL, *errdev = NULL; #ifdef CONFI