C#:Enum反模式

前端之家收集整理的这篇文章主要介绍了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值本身.

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

原文链接:https://www.f2er.com/csharp/97695.html

猜你在找的C#相关文章