有人一直在谈论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值本身.
我发现这些在一个已经有用的概念中非常有用.