一:背景 1. 讲故事 前段时间和同事负责一个项目的两个业务模块,可能大家缺少沟通,导致本该定义一个 Enum 的地方结果我俩各自定义了一个,导致后面这两个 Enum 进行对接就烦了,为了方便理解,也不想让大家看这崴脚的英文拼写,我就拿 银行 举例吧。 A同事 定义的枚举 public enum BankEnum { ICBC = 1, CMSB = 2, CMBC = 3 } B同事 定义的枚举 public enum ChinaBankEnum { 中国民生银行 = 1, 中国工商银行 = 2, 中国招商银行 【知识点详解】 在C#编程中,枚举(Enum)是一种强大的工具,用于定义一组相关的命名常量。然而,当不同开发人员或模块之间定义了相似但不完全相同的枚举时,就需要找到一种方法来方便地进行转换。本文将探讨如何简洁高效地实现在多个枚举类型之间的自由转换。 我们来看一个实际的例子。假设A同事和B同事各自定义了关于银行的枚举: ```csharp public enum BankEnum { ICBC = 1, CMSB = 2, CMBC = 3 } public enum ChinaBankEnum { 中国民生银行 = 1, 中国工商银行 = 2, 中国招商银行 = 3 } ``` 现在的问题是如何将`ChinaBankEnum`转换为`BankEnum`。一种直观但不灵活的方法是使用`switch`语句进行人工匹配: ```csharp static BankEnum ConvertToEnum(ChinaBankEnum chinaBank) { switch (chinaBank) { case ChinaBankEnum.中国工商银行: return BankEnum.ICBC; case ChinaBankEnum.中国民生银行: return BankEnum.CMSB; case ChinaBankEnum.中国招商银行: return BankEnum.CMBC; default: return default(BankEnum); } } ``` 然而,这种手动匹配的方法不够灵活,且不易于维护。我们可以考虑使用属性(Attribute)来描述枚举之间的映射关系,使得转换更加自动化。 C#中,可以自定义一个Attribute,如`DescriptionAttribute`,或者直接使用内置的`DescriptionAttribute`。在`BankEnum`上添加`DescriptionAttribute`,关联到相应的`ChinaBankEnum`: ```csharp [AttributeUsage(AttributeTargets.All)] public class DescriptionAttribute : Attribute { public DescriptionAttribute(string description) { } } public enum BankEnum { [Description(nameof(ChinaBankEnum.中国工商银行))] ICBC = 1, [Description(nameof(ChinaBankEnum.中国民生银行))] CMSB = 2, [Description(nameof(ChinaBankEnum.中国招商银行))] CMBC = 3 } ``` 然后,编写一个枚举扩展方法`ConvertTo<Target>`,利用反射获取`DescriptionAttribute`的值,并在目标枚举`Target`中查找匹配项: ```csharp public static class EnumExtension { public static Target ConvertTo<Target>(this Enum enumValue) where Target : Enum { var key = Enum.GetName(enumValue.GetType(), enumValue); var fields = typeof(Target).GetFields(); foreach (var field in fields) { var attribute = field.GetCustomAttribute<DescriptionAttribute>(); if (attribute == null) continue; if (key == attribute.Description) { var obj = (Target)field.GetValue(typeof(Target)); return obj; } } return default(Target); } } ``` 这样,我们就可以方便地进行枚举转换,例如: ```csharp ChinaBankEnum chinaBank = ChinaBankEnum.中国工商银行; BankEnum bank = chinaBank.ConvertTo<BankEnum>(); ``` 这个解决方案的优势在于它允许通过属性描述枚举之间的关系,使得转换过程更具可读性和可维护性。即使枚举值的顺序或数量发生变化,只要保持描述正确,转换仍然能够正常工作。此外,由于使用了反射,这个方法也具有一定的通用性,可以应用于其他类似的枚举转换场景。 总结,解决枚举之间的转换问题,可以借助C#的属性和反射机制,创建自定义的转换逻辑,使得代码更加简洁高效,同时也提高了代码的可复用性和可维护性。在实际项目中,这样的设计模式可以避免手动维护映射关系,降低因枚举定义不一致而引发的错误。

- 粉丝: 4
创作灵感
更多 >
我的内容管理
展开
我的资源
快来上传第一个资源
我的收益 登录查看自己的收益
我的积分
登录查看自己的积分
我的C币
登录后查看C币余额
我的收藏
我的下载
下载帮助
前往需求广场,查看用户热搜最新资源
- iotevents-jvm-1.4.84-sources.jar
- sms-jvm-0.17.11-beta.jar
- route53-jvm-1.1.27.jar
- code-testing-0.3.1-javadoc.jar
- redshiftdata-jvm-1.2.52-javadoc.jar
- location-jvm-1.3.88-sources.jar
- honeycode-0.22.1-beta-sources.jar
- sms-jvm-0.17.3-beta-javadoc.jar
- inspector2-jvm-1.0.1.jar
- jeap-messaging-infrastructure-kafka-reactive-test-8.17.0-jav
- org.hl7.fhir.r5-1.1.67-javadoc.jar
- robomaker-jvm-1.1.23-javadoc.jar
- Tomcat正常启动,访问所有页面均报404异常,404异常总结分析
- 软件测试理论与实践
- 使用两个4选1数据选择器(74LS153)集成一个8选1数据选择器,并完成电路设计、接线图绘制、调试连接和真值表测试
- 在MybatisPlus中获取插入数据的主键值示例代码


信息提交成功
评论0