C#:Enum反模式

有人一直在谈论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值本身.

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

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么