C#:枚举反模式

标签 c# .net design-patterns enums anti-patterns

<分区>

一直在谈论枚举通常违反清洁代码原则,因此我正在寻找人们最喜欢的枚举反模式和替代解决方案。

例如我见过这样的代码:

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 值本身。

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

关于C#:枚举反模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3913514/

相关文章:

.net - 微软是如何做到这一点的? (关于他们的 .NET HttpServerUtility 类的 OO 问题)

java - 设计模式——调度员

c# - 从文本框打开命令并将命令写入 cmd

c# - 阻止包含多个元素的集合?

c# - 如何将海量数据离线存储,然后批量更新到SQLite数据库中?

php - 面向对象设计问题

java - Java中的简单继承是什么设计模式?

c# - WCF DataContract 与 DataContract 接口(interface)

c# - 使用 EnvDTE 创建表单后不会保存

c# - 我怎样才能像在任务管理器中一样获取我的进程的 RAM 使用情况?