C# 通过枚举类型字符串,反射到枚举上

C# 通过枚举类型字符串,反射到枚举上

  • 通过类型字符串,反射出任意类型
  • 枚举类型
  • 通过反射调用枚举
    • GetTypeByName(EnumName) 为空?
  • 小结

通过类型字符串,反射出任意类型

之前老顾写过一篇博客,通过反射,使用字符串,可以反射出当前项目中所有可用的类型,包括泛型类型。需要补课的小伙伴可以围观下老顾之前的文章《C# 根据typename字符串,创建任意类型的对象(含泛型)》。

虽然老顾自己也说了,使用这个方法,一般都是自己掉坑里的选择,不过确实有时候也会用到。

枚举类型

一般在自己开发的程序中,针对于特定的有限数据,我们一般会做出一个枚举类型,来规范所有参与项目的小伙伴,避免出现歧义或不规范内容。

比如,一个订单状态,根据业务流程,我们可以分成几个阶段:

提交未处理
已接收订单
待付款
已付款
待发货
正在配送
已配送完成
订单完成

等等这样的有限状态集合。
在这里插入图片描述
也比如说,访问网络资源,会返回一些状态码,比如 200、404、401、500 之类的,这些都是有限状态,所以通常我们都可以用 Enum 来定义一个枚举集合,规范一下数据。

这样的操作,主要是为了避免有的小伙伴写做待付款,有的小伙伴写做未付款,还有的写作待支付。。。总之,不用枚举规范的话,天知道会出现多少相同意义的数据。

CSDN 文盲老顾的博客,https://blog.csdn.net/superwfei
老顾的个人社区,https://bbs.csdn.net/forums/bfba6c5031e64c13aa7c60eebe858a5f?category=10003&typeId=3364713

通过反射调用枚举

大多数时候,我们在使用枚举的时候,都是明确知道其类型的,所以,我们通常是直接用 Enum.GetName(枚举类型,值) 的方式来获取对应的文本描述。

但是,偶尔,我们需要调用枚举的位置,并不是我们手写的代码,而是类似模版定义这样的内容,比如,现在老顾就有这么一个模板定义:

404.enum.httpstate

404 是值,enum 是调用枚举,httpstate 是枚举类型

正常在程序里写的话,那么就应该是这样了

Enum.GetName(httpstate,404)

但是模版里的话。。。这个 httpstate 是可以解析了,但如果有多个模版,且枚举类型不一致呢?

比如,有这么个模板内容:

html symbols: ^lt,enum,htmlsymbols^ ^trage,enum,htmlsymbols^ ^gt,enum,htmlsymbols^
http state: ^200.enum.httpstate^ ^403.enum.httpstate^ ^500.enum.httpstate^ 
bidstate: ^11.enum.trade^ ^91.enum.trade^ ^99.enum.trade^

那么,这里出现了三个枚举类型,如果少的话,不通过反射,用程序一个一个分支,或者 switch 一下,也是可以的,但是,如果再出现新的类型,那么还是很痛苦的,经常需要改代码了。

所以,我们还是通过反射来实现枚举调用。

GetTypeByName(EnumName) 为空?

我们直接使用之前定义的通过类名字符串调用类的方法 GetTypeByName,里面的参数给一个枚举类型。。。结果。。。没有能获取到枚举类型?Type 返回的是 null ??

我连泛型都搞出来了,你告诉我,枚举不能用?

                        foreach (Type st in ts){if (RegexExpand.IsMatch(st.FullName, @"\." + RegexExpand.FormatRegExp(source) + @"(`?\d+)?$")){return st;}}

打开原来的代码,在 RegexExpand.IsMatch 这一行,老顾打了一个断点,然后,发现枚举Enum 的字符串类型。。。有点哭笑不得。

在这里插入图片描述
好么,类的话,FullName 就是 xxx.yyy.zzz 的方式,泛型就是 xxx.yyy.zzz`n 的方式,结果,枚举类型,你给来了个 xxx.yyy+zzz 的方式。。。。

所以,修改起来也非常简单,把刚才代码中的正则 @“\.” 换成 @“[\.+]” 即可。

然后,我们就可以正常的调用枚举处理内容了:

                        try{Type t = Common.GetTypeByName(枚举类型字符串);return Enum.GetName(t, int.Parse(枚举值));}catch (Exception ex){return ex.Message;}

小结

好吧,没什么可多总结的,就是 FullName 的格式,有点出乎预料,也许,还有其他形式的FullName。总之,还是要多见识见识才好。

另外,再补充一下,直接把 RegexExpand 修改成 Regex 即可,这是老顾自己定义的一个静态类,继承并扩充了一下 Regex 罢了。

FormatRegExp 方法,就是将字符串转成正则表达式,类似 py 中的 re.escape

        public static string FormatRegExp(string str){return str.Replace("\\", @"\\").Replace("(", "\\(").Replace(")", "\\)").Replace("{", "\\{").Replace("}", "\\}").Replace("[", "\\[").Replace("]", "\\]").Replace(".", "\\.").Replace("+", "\\+").Replace("-", "\\-").Replace("^", "\\^").Replace("$", "\\$").Replace("?", "\\?").Replace("*", "\\*").Replace("|", "\\|");}

其实,就是几个字符替换的事,自己随便放到哪里都可以。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA+java+spring+hibernate+jquery+mysql后台管理系统

IDEA javaspringhibernatejquerymysql后台管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.修改密码3.我的内容4.我的操作日志5. 我的登陆日志6. 我的登陆授权7. 内容管理8.标签管理9. 搜索词管理10.分类管理11.分类类型12.标签分类13.用户管理14.部门管理15.角色…

Linux系统编程(信号处理机制)

文章目录 前言一、中断,异常,信号的区别二、信号在Linux中的标识三、信号处理相关函数四、代码实验总结 前言 本篇文章我们来讲解信号的处理机制,信号处理在Linux操作系统中必不可少,这一点值得大家注意,信号又会与中…

golang 日志库zap和日志切割实践

介绍 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 能够将事件记录到文件中,而不是应用程序控制台。 日志切割-能够根据文件大小、时间或间隔等来切割日志文件。 支持不同的日志级别。例如INFO,DEBUG&a…

深度学习与神经网络

人工智能,机器学习,深度学习,神经网络,emmmm,傻傻分不清楚,这都啥呀,你知道吗?我不知道。你知道吗?我不知道。 来来来,接下来,整硬菜&#xff1a…

『红外图像 数据增强』DDE(Digital Detail Enhancement)算法

DDE处理的细节 分离背景层和细节层:使用特殊的滤波器,将图像分成背景层和细节层。背景层通常包含低频信息,而细节层包含高频信息。 对背景层进行灰度增强:通过对背景层应用适当的灰度增强算法,提高背景层的对比度和视…

轻量级应用服务器开放端口

关于使用浏览器连接自己所写的TCP进程时,由于没有开放端口,而且搜索到对应的操作来进行开放端口,所以在完成开放端口后特意做个笔记,防止忘记。 登录自己所使用的服务器的网站找到控制台 找到轻量级应用服务器 找到所需要开放端口…

【机器学习】分类算法 - KNN算法(K-近邻算法)KNeighborsClassifier

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:零基础快速入门人工智能《机器学习入门到精通》 K-近邻算法 1、什么是K-近邻算法?2、K-近邻算法API3、…

最强自动化框架,Pytest自动化测试-动态切换环境实战(超细整理)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 在开始前&#xf…

LangChain大型语言模型(LLM)应用开发(五):评估

LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

ceph应用

资源池 Pool 管理 上面我们已经完成了 Ceph 集群的部署,但是我们如何向 Ceph 中存储数据呢?首先我们需要在 Ceph 中定义一个 Pool 资源池。Pool 是 Ceph 中存储 Object 对象抽象概念。我们可以将其理解为 Ceph 存储上划分的逻辑分区,Pool 由多…

Qt6 Qt Quick UI Prototype学习QML第一篇

Qt6 Qt Quick UI原型学习QML第一篇 开始创建项目Qt Quick UI原型简介.qmlproject文件举例Window平台小例子运行效果QML语法 了解语法 开始创建项目 创建一个具有QML入口点的Qt Quick 2 UI项目。要使用它,您需要设置一个QML运行时环境,例如gmlscene。 仅当…

消息队列——rabbitmq的不同工作模式

目录 Work queues 工作队列模式 Pub/Sub 订阅模式 Routing路由模式 Topics通配符模式 工作模式总结 Work queues 工作队列模式 C1和C2属于竞争关系,一个消息只有一个消费者可以取到。 代码部分只需要用两个消费者进程监听同一个队里即可。 两个消费者呈现竞争关…

安全防御 --- DDOS攻击(01)

DOS攻击(deny of service)--- 拒绝式服务攻击 例:2016年10月21日,美国提供动态DNS服务的DynDNS遭到DDOS攻击,攻击导致许多使用DynDNS服务的网站遭遇访问问题,此事件中,黑客人就是运用了DNS洪水…

golang waitgroup

案例 WaitGroup 可以解决一个 goroutine 等待多个 goroutine 同时结束的场景,这个比较常见的场景就是例如 后端 worker 启动了多个消费者干活,还有爬虫并发爬取数据,多线程下载等等。 我们这里模拟一个 worker 的例子 package mainimport (…

ChatGPT与Claude对比分析

一 简介 1、ChatGPT: 访问地址:https://chat.openai.com/ 由OpenAI研发,2022年11月发布。基于 transformer 结构的大规模语言模型,包含1750亿参数。训练数据集主要是网页文本,聚焦于流畅的对话交互。对话风格友好,回复通顺灵活,富有创造性。存在一定的安全性问题,可…

【深度学习】基于BRET的高级主题检测

一、说明 使用BERT,UMAP和HDBSCAN捕获文档主题,紧随最先进的BERTopic架构(transformer编码器)。 主题检测是一项 NLP 任务,旨在从文本文档语料库中提取全局“主题”。例如,如果正在查看书籍描述的数据集,主题检测将使我们能够将书籍分类,例如:“浪漫”、“科幻”、“旅…

Springboot+Flask+Neo4j+Vue2+Vuex+Uniapp+Mybatis+Echarts+Swagger综合项目学习笔记

文章目录 Neo4j教程:Neo4j高性能图数据库从入门到实战 医疗问答系统算法教程:医学知识图谱问答系统项目示例:neo4j知识图谱 Vueflask 中药中医方剂大数据可视化系统可视化技术:ECharts、D.jsflask教程:速成教程Flask w…

list模拟实现

一、结点的定义 有三个成员&#xff0c;2个指向前面和后面的指针&#xff0c;一个表示结点存储T类型的值。 对于_prev和_next&#xff0c;类型是 list_node<T>*&#xff0c;不是list_node*&#xff0c;加上类型参数T之后&#xff0c;才是模板类的类型。 构造函数中&am…

【MySQL】MySQL8.1.0版本正式发布带来哪些新特性?

文章目录 前言一、畅谈新版本二、8.1.0版本部署2.1、环境准备2.2、配置yum安装依赖2.3、用户及目录创建2.4、创建用户及组2.5、解压缩包2.6、环境变量配置2.7、创建参数文件2.8、数据库初始化2.9、启动Mysql2.10、登陆MySQL 8.1 三、新特性3.1、密码参数3.2、错误日志加强3.3、…

Spring Security OAuth2.0(6):自定义认证自定义登录页

文章目录 自定义登录界面配置自定义登录页面 自定义登录界面 \qquad 你可能想知道登录页面从哪里来&#xff1f;因为我们并没有提供任何的HTML或JSP文件。Spring Security 的默认配置没有明确设定一个登录页面的URL&#xff0c;因此Spring Security 会根据启用的功能自动生成一…