分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

.Net下枚举的巧用

发布时间:2023-09-06 02:29责任编辑:郭大石关键词:暂无标签

用户故事:

  下图是系统中一组基于位运算的类别,其值分别为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 ???{ ???????/// <summary> ???????/// 枚举值获取Description信息/// </summary> ???????/// <param name="EnumValue"></param> ???????/// <param name="enumType"></param> ???????/// <returns></returns> ???????public static List<String> GetEnumValueDescriptions(int EnumValue, Type enumType) ???????{ ???????????List<string> strs = new List<string>(); ???????????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 ???????{ ???????????/// <summary> ???????????/// 低价RC ???????????/// </summary> ???????????[Description("低价RC")] ???????????LowRC = 1, ???????????/// <summary> ???????????/// 提前RC ???????????/// </summary> ???????????[Description("提前RC")] ???????????AdvRC = 2, ???????????/// <summary> ???????????/// 舱等RC ???????????/// </summary> ???????????[Description("舱等RC")] ???????????ClassRC = 4, ???????????[Description("协议RC")] ???????????ProtocolRc = 8, ???????????[Description("公里数RC")] ???????????DistanceRC = 16 ???????}

调用代码:  

 List<string> enumList = EnumDescriptionHelp.GetEnumValueDescriptions(rcType, typeof(FlightRCTypeEnum)); return enumList.Any() ? string.Join(",", enumList) : "";

 总结:

  在程序中巧用位运算,很多时候可以达到事半功倍的效果,特别是对于那些需要枚举的属性值来讲。但是技巧只是第一步,如何在代码层面使用好这个技巧,需要我们在编码的时候多想一步,为系统,为自己也为后来者提供一个易读,易维护的代码环境。

.Net下枚举的巧用

原文地址:https://www.cnblogs.com/ChrisZhou/p/10240315.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved