一直在谈论枚举通常违反清洁代码原则,因此我正在寻找人们最喜欢的枚举反模式和替代解决方案。
例如我见过这样的代码:
switch(enumValue) {
case myEnum.Value1:
// ...
break;
case myEnum.Value2:
// ...
break;
}
这比使用魔法字符串的 switch 语句好一步,但这可能可以用工厂、容器或其他模式更好地解决。
甚至像这样的老式代码:
if(enumValue == myEnum.Value1) {
// ...
} else if (enumValue == myEnum.Value2) {
// ...
}
您还遇到过哪些其他反模式和更好的枚举实现?
我认为枚举非常有用。我为 Enum 编写了一些扩展,这些扩展为其使用增加了更多值(value)
首先是描述扩展方法
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 = ',';
}
这将允许我像这样定义枚举:
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 值本身。
我发现这些在一个非常有用的概念中非常有用。