.Net下枚举的巧用

2021-10-01 23:21

阅读:3045

标签:tde   解决   summary   结果   ret   help   用户故事   分享   环境   用户故事:   下图是系统中一组基于位运算的类别,其值分别为1,2,4,8,16。由于可以进行随意组合,所以落库值为[1,31]区间的任意值。      我们需要在页面上展示所有的组合,如下图:        如果使用if或者switch语句根据组合来输出组合对应的文本,那么就要写从[1,31]区间31种条件表达式,代码充斥着腐朽的味道。如果需求变动,再加几个类别的话。。。不好,是心肌梗塞的感觉: switch (rcType) { case 1: rcTypeDes = "低价RC"; break; case 2: rcTypeDes = "提前天数RC"; break; case 3: rcTypeDes = "低价RC,提前天数RC"; break; case 4: rcTypeDes = "舱等RC"; break; case 5: rcTypeDes = "低价RC,舱等RC"; break; case 6: rcTypeDes = "提前天数RC,舱等RC"; break; case 7: rcTypeDes = "低价RC,提前天数RC,舱等RC"; break; case 8: rcTypeDes = "协议RC"; break; case 9: rcTypeDes = "低价RC,协议RC"; break; case 10: rcTypeDes = "提前天数RC,协议RC"; break; case 11: rcTypeDes = "低价RC,提前天数RC,协议RC"; break; case 12: rcTypeDes = "舱等RC,协议RC"; break; case 13: rcTypeDes = "低价RC,舱等RC,协议RC"; break; case 14: rcTypeDes = "提前天数RC,舱等RC,协议RC"; break; case 15: rcTypeDes = "低价RC,提前天数RC,舱等RC,协议RC"; break; case 16: rcTypeDes = "公里数RC"; break; case 17: rcTypeDes = "低价RC,公里数RC"; break; case 18: rcTypeDes = "提前天数RC,公里数RC"; break; case 19: rcTypeDes = "低价RC,提前天数RC,公里数RC"; break; case 20: rcTypeDes = "舱等RC,公里数RC"; break; case 21: rcTypeDes = "低价RC,舱等RC,公里数RC"; break; case 22: rcTypeDes = "提前天数RC,舱等RC,公里数RC"; break; case 23: rcTypeDes = "低价RC,提前天数RC,舱等RC,公里数RC"; break; case 24: rcTypeDes = "协议RC,公里数RC"; break; case 25: rcTypeDes = "低价RC,协议RC,公里数RC"; break; case 26: rcTypeDes = "提前天数RC,协议RC,公里数RC"; break; case 27: rcTypeDes = "低价RC,提前天数RC,协议RC,公里数RC"; break; case 28: rcTypeDes = "舱等RC,协议RC,公里数RC"; break; case 29: rcTypeDes = "低价RC,舱等RC,协议RC,公里数RC"; break; case 30: rcTypeDes = "提前天数RC,舱等RC,协议RC,公里数RC"; break; case 31: rcTypeDes = "低价RC,舱等RC,协议RC,公里数RC,公里数RC"; break; }   解决方案:   在C#中,Enum对象提供了GetValues(Enum)方法,遍历指定的枚举对象获得一个Array对象,我们可以通过传入的组合(比如3)来和Array中的元素进行对比,利用Enum.HasFlag可以判断是否满足位运算的结果,比如组合为3,当前遍历到的类别元素为1,那么HasFlag为真:    public static class EnumDescriptionHelp { /// /// 枚举值获取Description信息/// /// /// /// public static List GetEnumValueDescriptions(int EnumValue, Type enumType) { List strs = new List(); var enumvalues = Enum.GetValues(enumType); Enum temp = (Enum)Enum.ToObject(enumType, EnumValue); foreach (var temp2 in enumvalues) { if (temp.HasFlag((Enum)temp2)) { strs.Add((temp2 as Enum).GetDescription()); } } return strs; } } public enum FlightRCTypeEnum : int { /// /// 低价RC /// [Description("低价RC")] LowRC = 1, /// /// 提前RC /// [Description("提前RC")] AdvRC = 2, /// /// 舱等RC /// [Description("舱等RC")] ClassRC = 4, [Description("协议RC")] ProtocolRc = 8, [Description("公里数RC")] DistanceRC = 16 }   调用代码:   List enumList = EnumDescriptionHelp.GetEnumValueDescriptions(rcType, typeof(FlightRCTypeEnum)); return enumList.Any() ? string.Join(",", enumList) : "";    总结:   在程序中巧用位运算,很多时候可以达到事半功倍的效果,特别是对于那些需要枚举的属性值来讲。但是技巧只是第一步,如何在代码层面使用好这个技巧,需要我们在编码的时候多想一步,为系统,为自己也为后来者提供一个易读,易维护的代码环境。.Net下枚举的巧用标签:tde   解决   summary   结果   ret   help   用户故事   分享   环境   原文地址:https://www.cnblogs.com/ChrisZhou/p/10240315.html


评论


亲,登录后才可以留言!