C#:Enum反模式
发布时间:2020-12-15 18:08:56 所属栏目:百科 来源:网络整理
导读:有人一直在谈论Enums一般违反清洁守则原则,所以我正在寻找人们最喜欢的Enum反模式和替代解决方案. 例如,我见过这样的代码: switch(enumValue) { case myEnum.Value1: // ... break; case myEnum.Value2: // ... break;} 它比带有魔术字符串的switch语句更好
有人一直在谈论Enums一般违反清洁守则原则,所以我正在寻找人们最喜欢的Enum反模式和替代解决方案.
例如,我见过这样的代码: switch(enumValue) { case myEnum.Value1: // ... break; case myEnum.Value2: // ... break; } 它比带有魔术字符串的switch语句更好一步,但这可能已经通过工厂,容器或其他模式更好地解决了. 甚至像这样的老派代码: if(enumValue == myEnum.Value1) { // ... } else if (enumValue == myEnum.Value2) { // ... } 您对枚举有哪些其他反模式和更好的实现? 解决方法
我认为Enums非常有用.我为Enum写了一些扩展,为它的使用增加了更多的价值
首先,有Description扩展方法 public static class EnumExtensions { public static string Description(this Enum value) { var entries = value.ToString().Split(ENUM_SEPERATOR_CHARACTER); var description = new string[entries.Length]; for (var i = 0; i < entries.Length; i++) { var fieldInfo = value.GetType().GetField(entries[i].Trim()); var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute),false); description[i] = (attributes.Length > 0) ? attributes[0].Description : entries[i].Trim(); } return String.Join(",",description); } private const char ENUM_SEPERATOR_CHARACTER = ','; } 这将允许我像这样定义en enum: public enum MeasurementUnitType { [Description("px")] Pixels = 0,[Description("em")] Em = 1,[Description("%")] Percent = 2,[Description("pt")] Points = 3 } 并通过这样做得到标签:var myLabel = rectangle.widthunit.Description()(不需要switch语句). 如果rectangle.widthunit = MeasurementUnitType.Pixels,它将返回“px”,如果rectangle.widthunit = MeasurementUnitType.Pixels,它将返回“px,em” MeasurementUnitType.Em. 然后,有一个 public static IEnumerable<int> GetIntBasedEnumMembers(Type @enum) { foreach (FieldInfo fi in @enum.GetFields(BindingFlags.Public | BindingFlags.Static)) yield return (int)fi.GetRawConstantValue(); } 这将让我遍历任何基于int的值的枚举并返回int值本身. 我发现这些在一个已经有用的概念中非常有用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |