C#:Enum反模式

Seb*_*son 6 .net c# enums design-patterns anti-patterns

有人一直在谈论Enums一般违反清洁守则原则,所以我正在寻找人们最喜欢的Enum反模式和替代解决方案.

例如,我见过这样的代码:

switch(enumValue) {
    case myEnum.Value1:
        // ...
        break;
    case myEnum.Value2:
        // ...
        break;
}
Run Code Online (Sandbox Code Playgroud)

它比带有魔术字符串的switch语句更好一步,但这可能已经通过工厂,容器或其他模式更好地解决了.

甚至像这样的老派代码:

if(enumValue == myEnum.Value1) {
   // ...
} else if (enumValue == myEnum.Value2) {
   // ...
}
Run Code Online (Sandbox Code Playgroud)

您对枚举有哪些其他反模式和更好的实现

dan*_*els 11

我认为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 = ',';
}
Run Code Online (Sandbox Code Playgroud)

这将允许我像这样定义en enum:

 public enum MeasurementUnitType
 {
    [Description("px")]
    Pixels = 0,
    [Description("em")]
    Em = 1,
    [Description("%")]
    Percent = 2,
    [Description("pt")]
    Points = 3
 }
Run Code Online (Sandbox Code Playgroud)

通过这样做获得标签:( var myLabel = rectangle.widthunit.Description()不需要任何switch声明).

这将返回"px"如果rectangle.widthunit = MeasurementUnitType.Pixels或它将返回"px,em"if rectangle.widthunit = MeasurementUnitType.Pixels | MeasurementUnitType.Em.

然后,有一个

    public static IEnumerable<int> GetIntBasedEnumMembers(Type @enum)
    {
        foreach (FieldInfo fi in @enum.GetFields(BindingFlags.Public | BindingFlags.Static))
            yield return (int)fi.GetRawConstantValue();
    }
Run Code Online (Sandbox Code Playgroud)

这将让我遍历任何基于int的值的枚举并返回int值本身.

我发现这些在一个已经有用的概念中非常有用.

  • @Seb:有几个原因:首先,如果你使用Dictionary,说明就在声明旁边而不是其他地方.其次,描述始终与枚举类型一起出现,这导致...最后,类型可以导入到另一个程序集中,枚举值及其描述可以反映并呈现给用户(对于编辑器很有用,并且是有用的)我弄完了). (3认同)