C#大型枚举拆分至不同文件的扩展性问题解决方案咨询
大型枚举拆分后的类型兼容解决方案
给新枚举加隐式转换运算符
直接在新枚举的扩展类里定义隐式转旧枚举的逻辑,调用时自动转换不用手动强转。注意新枚举的数值必须和旧枚举不重复(比如从1701开始用),避免值冲突。public enum SmallerNicerEnumList { NewItem1 = 1701, NewItem2 = 1702 // 其他领域枚举值 } public static class SmallerNicerEnumListExtensions { public static implicit operator OldBigListDoneBySomeIrresponsiveDev(SmallerNicerEnumList newEnum) { return (OldBigListDoneBySomeIrresponsiveDev)(int)newEnum; } }用partial拆分旧枚举(C#9+适用)
不用新建枚举,把旧枚举改成partial,拆分到多个领域文件里,既解决原文件臃肿问题,又完全兼容原有调用。比如:// OldBigListDoneBySomeIrresponsiveDev.Core.cs(原有1700+条) public partial enum OldBigListDoneBySomeIrresponsiveDev { Item1 = 1, Item2 = 2, // ... 原有枚举值 } // OldBigListDoneBySomeIrresponsiveDev.OrderDomain.cs(新增订单领域枚举) public partial enum OldBigListDoneBySomeIrresponsiveDev { Order_NewItem1 = 1701, Order_NewItem2 = 1702 }封装适配层统一处理转换
写个工具类专门做新枚举到旧枚举的转换,还能加校验逻辑,避免非法值传入。调用时统一用这个工具类,减少重复强转代码:public static class EnumAdapter { public static OldBigListDoneBySomeIrresponsiveDev ToOldEnum(SmallerNicerEnumList newEnum) { var enumValue = (int)newEnum; if (!Enum.IsDefined(typeof(OldBigListDoneBySomeIrresponsiveDev), enumValue)) { throw new ArgumentOutOfRangeException(nameof(newEnum), "该枚举值未在旧枚举中定义"); } return (OldBigListDoneBySomeIrresponsiveDev)enumValue; } } // 调用示例 SomeFunction(EnumAdapter.ToOldEnum(SmallerNicerEnumList.NewItem1));逐步替换旧枚举类型
如果有重构计划,可以先把原有函数、属性的参数类型从旧枚举改成int(因为枚举底层是int),这样新旧枚举都能直接转int传入。之后慢慢把旧枚举的引用替换成新的拆分枚举,最后移除旧枚举。比如修改属性:// 原来的写法 // public OldBigListDoneBySomeIrresponsiveDev AttrID { get; set; } // 修改后 public int AttrID { get; set; }
内容的提问来源于stack exchange,提问作者albanx
相关产品推荐
相关产品推荐

