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