网易首页 > 网易号 > 正文 申请入驻

开源 - Ideal库 - 枚举扩展设计思路及实现难点(三)

0
分享至

今天想和大家分享关于枚举扩展设计思路和在实现过程中遇到的难点。

01、设计思路

设计思路说起来其实也很简单,就是通过枚举相关信息:枚举值、枚举名、枚举描述、枚举项、枚举类型,进行各种转换,通过一个信息获取其他信息。比如通过枚举项获取枚举描述、通过枚举类型获取枚举名称-枚举描述键值对用于下拉列表等等。

主要包括以下几类转换实现:

(1)通过枚举值转成:枚举、枚举名称、举描述;

(2)通过枚举名称转成:枚举、枚举值、枚举描述;

(3)通过枚举描述转成:枚举、枚举值、枚举名称;

(4)通过枚举项转成:枚举值、枚举描述;

(5)通过枚举类型转成:枚举值-枚举名称、枚举值-枚举描述、枚举名称-枚举值、枚举名称-枚举描述、枚举描述-枚举值、枚举描述-枚举名称等键值对集合;

02、实现难点

在实现过程中的确遇到一些难点以及需要注意的小细节。

1、枚举名称转枚举中的小细节

在实现枚举名称转枚举的过程中遇到了一个小坑。

枚举本身提供了Enum.TryParse方法用于把枚举名称字符串或者枚举值字符串转为枚举,因此我们选用了此方法实现枚举名称转枚举。但是我们自己这个接口设计目标是把枚举名称转为枚举,因此需要排除误传枚举值字符串的情况。

方案:当转换成功后,我们还需要调用Enum.IsDefined方法检查枚举名称字符串是否是有效的枚举名称字符串,如果不是枚举中现有的有效枚举项,还需要考虑是否为位标志组合情况。

代码如下:

2、枚举描述转枚举中的小细节

在实现枚举描述转枚举的过程中对于带位标志枚举处理需要特别小心。我们知道位标志枚举有个特性是枚举项之间可以通过位操作进行组合得到一个有效的枚举项,而且这个枚举项还不存在于当前定义的枚举中。这就要求我们必须处理好组合情况。

方案:因此可以按照以下步骤进行处理。

(1)优先处理当枚举不带位标志的情况;

(2)再处理带位标志的情况;

位标志组合是通过英文逗号[,]拼接的,因此还要考虑到如果一个描述字符串中带有英文逗号[,],但是本身又不是组合的情况。

(3)先把描述当作不是组合情况,先处理一遍,如果转换成功则结束转换;

(4)如果是组合的情况,则计算出组合的每项枚举值,通过位操作得到其对应的枚举项;

而在组合的情况中还需要考虑,如果有组合的项时无效的情况,则这个枚举描述转换应该标记为无效。

(5)判断组合的每一项都是正确的,否则返回空;

(6)将通过组合计算出来的枚举项转为枚举;

因为通过枚举值转枚举过程中还需要明确枚举值类型才行,因此最后一步还需要根据枚举类型实际的基础类型调用不同的转换方法。

具体代码如下:

3、枚举转枚举值中的小细节

我们知道在定义枚举的时候可以指定枚举值类型为以下八种类型sbyte、byte、short、ushort、int、uint、long、ulong,因此所有涉及到返回枚举值的方法,我们要考虑到支持不同类型的枚举值类型返回。

同时我们也知道相同的方法名和入参,并不能通过不同的返回类型区分出不同的重载方法。

方案:因此我们可以通过泛型的方法支持不同类型的枚举值类型返回。

4、通过枚举值转换的小细节

通过上面我们知道枚举值类型有八种,因此涉及到枚举值转换出其他信息是需要同时兼容这八种类型。

要实现这个功能,可以用上面提到的泛型,如果使用泛型我们可以使用struct类型来限制枚举值泛型TValue,因为struct可以覆盖枚举值的八种类型,但是也引发了另一个问题就是float、double、DateTime都是struct类型,这样就导致这些类型在编辑器中也可以点出ToEnumByValue等相关方法。

作为一个公共封装方法,这种方式显然是对用户不友好的。

因此我们选择另外一种方式:重载方法来实现,通过封装方法多写一些代码来实现对用户友好调用。

5、如何高效返回键值对数据

在通过枚举类型转成各种键值对集合时,有些方法需要用到反射,因此如何高效的获取这些信息就变成重中之重。

最直接的想法是直接把每种枚举类型对应的键值对集合直接缓存起来,下次用到的时候直接从缓存中获取即可。

但是仔细详细,一共有3个数据:枚举值、枚举名称、枚举描述。两两组合有6种情况,也就是要6个缓存存储12个数据,这样其实就相当于浪费了3倍的空间。

当然我们可以把这三个值存一份,然后在需要的是直接组合获取,但是我们仔细分析一些是否有必要把所有数据都缓存下来。

枚举值会涉及到类型转换,枚举名称涉及调用ToString方法,枚举描述需要用到反射。这其中最好性能的非枚举描述不可,因此枚举描述肯定需要缓存,枚举值和枚举名称可以考虑缓存。

假如我们只缓存枚举描述,那么枚举值和枚举名称在使用的时候直接转换,那么我们执行要一份记录枚举描述的缓存以及一份记录枚举类型对应其所有枚举项的缓存即可。另外因为枚举对应的是否带位标志标记以及掩码可以同时记录下来。

代码如下:

获取枚举名称-枚举描述键值对代码如下,首先获取枚举类型基础信息,然后把枚举项集合转为键值对集合。

6、如何识别一个枚举值是否为有效的位标志组合

如何识别一个枚举值是否是一个有效的位标志组合,可以说是整个代码中最难的部分了,其实前面也有提到,主要应用掩码的思想,上一章节已经详解讲解了这里就不在赘述了。

稍晚些时候我会把库上传至Nuget,大家可以直接使用Ideal.Core.Common。

:测试方法代码以及示例源码都已经上传至代码库,有兴趣的可以看看。https://gitee.com/hugogoos/Ideal

声明:个人原创,仅供参考

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
1个月100万佣金收入,年营收过亿:30岁女孩宣布退休,她是做啥的

1个月100万佣金收入,年营收过亿:30岁女孩宣布退休,她是做啥的

江山挥笔
2026-02-05 18:06:12
北京阿姨通透,把十几年来买的金条全卖了,称:涨了不卖留着干啥

北京阿姨通透,把十几年来买的金条全卖了,称:涨了不卖留着干啥

我心纵横天地间
2026-02-01 13:18:57
“兄弟俩获180万元拆迁款被控敲诈勒索”案二审维持原判:此前两人分别获刑7年、10年

“兄弟俩获180万元拆迁款被控敲诈勒索”案二审维持原判:此前两人分别获刑7年、10年

极目新闻
2026-02-06 11:29:40
出狱后的雷政富饭店照片曝光,沧桑感袭面而来,前后对比引人唏嘘

出狱后的雷政富饭店照片曝光,沧桑感袭面而来,前后对比引人唏嘘

李昕言温度空间
2026-02-05 23:16:19
江苏一工厂年终奖分3次发放被吐槽!网友:我们集团是世界五百强

江苏一工厂年终奖分3次发放被吐槽!网友:我们集团是世界五百强

火山诗话
2026-02-06 05:53:34
离队56天!徐正源炮轰蓉城:高层一手操控球员转会 将我彻底架空

离队56天!徐正源炮轰蓉城:高层一手操控球员转会 将我彻底架空

风过乡
2026-02-06 09:24:38
杨瀚森7分钟7助攻,亚洲第一控卫已成公牛轮换阵容

杨瀚森7分钟7助攻,亚洲第一控卫已成公牛轮换阵容

小犙拍客在北漂
2026-02-06 10:29:33
国企的中层小领导也熬不住了

国企的中层小领导也熬不住了

微微热评
2026-01-30 11:32:23
上海老头乐闯红灯案判赔36万,撕开了中国道路交通治理的荒诞伤口

上海老头乐闯红灯案判赔36万,撕开了中国道路交通治理的荒诞伤口

八桂知事
2026-02-05 16:53:25
固始新娘越扒越有!高中同学发声,曝新娘更多过往,刻薄并非偶然

固始新娘越扒越有!高中同学发声,曝新娘更多过往,刻薄并非偶然

奇思妙想草叶君
2026-02-05 22:37:25
中共中央批准,开除林景臻党籍

中共中央批准,开除林景臻党籍

新京报
2026-02-06 10:43:07
民进党天塌了: 特朗普亲口连夜向中国做出一项承诺,一切刚刚开始

民进党天塌了: 特朗普亲口连夜向中国做出一项承诺,一切刚刚开始

东极妙严
2026-02-05 13:37:20
河南一景区发巨额年终奖,有员工领到45万

河南一景区发巨额年终奖,有员工领到45万

大风新闻
2026-02-05 18:42:03
亚朵涨到3000块一晚,潮汕要被外地游客挤爆了

亚朵涨到3000块一晚,潮汕要被外地游客挤爆了

源Sight
2026-02-05 16:46:25
苏-57神话破灭!被吹上天的“隐身战机”,实则是大号三代机

苏-57神话破灭!被吹上天的“隐身战机”,实则是大号三代机

老马拉车莫少装
2026-02-06 00:00:23
购房竟被物业要求承担前业主17年欠费!新业主:水电还被停了

购房竟被物业要求承担前业主17年欠费!新业主:水电还被停了

福建第一帮帮团
2026-02-05 19:00:35
“资助不起装什么孙子!”2006年,贫困大学生向海清向媒体怒斥

“资助不起装什么孙子!”2006年,贫困大学生向海清向媒体怒斥

百态人间
2026-02-05 15:42:49
中国AI拒绝仰视

中国AI拒绝仰视

正解局
2026-02-05 21:40:04
牢A离人设翻车很近了

牢A离人设翻车很近了

寄居在世
2026-02-03 21:37:08
杨幂开撕微博风波升级!肖战已换回座位,微博之夜回应惹争议!

杨幂开撕微博风波升级!肖战已换回座位,微博之夜回应惹争议!

古希腊掌管月桂的神
2026-02-05 21:30:40
2026-02-06 12:59:00
IT规划师
IT规划师
热爱编程,追求最佳实践,喜欢思想的碰撞
78文章数 906关注度
往期回顾 全部

科技要闻

微信封禁元宝红包后,又把阿里千问封了

头条要闻

媒体:损失惨重 在台湾问题上碰瓷的立陶宛"知道错了"

头条要闻

媒体:损失惨重 在台湾问题上碰瓷的立陶宛"知道错了"

体育要闻

西甲射手榜第2,身价不到姆巴佩1/40

娱乐要闻

微博之夜红毯好精彩,堪比婚礼现场

财经要闻

很意外,美债危机要化解了

汽车要闻

标配华为乾崑解决方案 华境S完成六座满载冬测

态度原创

数码
艺术
家居
公开课
军事航空

数码要闻

英伟达DLSS 4.5六倍多帧生成与动态多帧生成特性将于4月上线

艺术要闻

Kristin Vestgard:挪威当代画家

家居要闻

现代轻奢 温馨治愈系

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

不惧以军拦截 “全球坚韧船队”将再赴加沙

无障碍浏览 进入关怀版