.Net下枚举的巧用

用户故事:

  下图是系统中一组基于位运算的类别,其值分别为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) : "";

 总结:

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

猜你喜欢

转载自www.cnblogs.com/ChrisZhou/p/10240315.html