加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#:Enum反模式

发布时间:2020-12-15 18:08:56 所属栏目:百科 来源:网络整理
导读:有人一直在谈论Enums一般违反清洁守则原则,所以我正在寻找人们最喜欢的Enum反模式和替代解决方案. 例如,我见过这样的代码: switch(enumValue) { case myEnum.Value1: // ... break; case myEnum.Value2: // ... break;} 它比带有魔术字符串的switch语句更好
有人一直在谈论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值本身.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读