友好的枚举字符串标志属性

时间:2015-08-05 15:37:16

标签: c# enums attributes overloading extension-methods

在对C#this answer中的枚举值一般创建友好字符串访问的常用方法进行一些其他问题后,似乎是我最好的选择,其中友好字符串可以放在定义中使用DescriptionAttribute s进行枚举。

我将其实现为扩展方法,但很快意识到它只适用于未指定[Flags]属性的标准枚举。我不完全确定在属性存在的情况下实现此目的的最佳方法。

由于flags属性意味着可以同时选择多个值,因此使用单个“友好字符串”是没有意义的。我正在考虑以相同的方式定义友好字符串,但是重载扩展方法以获取特定的枚举类型,它将返回List<string>以为所有选定值提供友好字符串。

上面描述的解决方案可行,但我觉得会有很多代码重复,因为每个使用Flags属性的枚举都需要它自己的扩展方法,因为枚举只能由System.Enum继承,从而消除了我的能够创建基本类型。如果我有一个更通用的方法可以通过检查枚举是否存在flags属性然后返回以下之一来处理这个问题会更好:

  • 单个字符串(如果没有标志),列表(如果标志) - 签名返回object
  • 单个字符串(如果没有标志),列表(如果标志) - 签名返回dynamic
  • 如果未指定flags,则可能只包含一个值的列表 - 签名返回List<string>

我觉得这个问题可能是“吃我的蛋糕并且吃了它”的情况,因为在收到友好的字符串并重复我的代码后,我宁愿不必做额外的检查。有没有一个技巧或好方法来做这不是一个混乱的黑客?

2 个答案:

答案 0 :(得分:2)

您可以像链接的答案一样编写方法,但支持标记枚举,并返回逗号分隔的字符串,如:

public static string GetDescription(Enum value)
{
    Type type = value.GetType();
    var values = Enum.GetValues(type);
    var setValues = new List<Enum>();
    foreach(var enumValue in values)
    {
        if (value.HasFlag((Enum)enumValue))
            setValues.Add((Enum)enumValue);
    }
    var stringList = new List<string>();
    foreach (var singleValue in setValues)
    {
        var name = Enum.GetName(type, singleValue);
        if (name != null)
        {
            FieldInfo field = type.GetField(name);
            if (field != null)
            {
                DescriptionAttribute attr =
                       Attribute.GetCustomAttribute(field,
                         typeof(DescriptionAttribute)) as DescriptionAttribute;
                if (attr != null)
                {
                    stringList.Add(attr.Description);
                }
            }
        }
    }
    return string.Join(",", stringList.ToArray());
}

不是最干净的代码,但是你得到了这个想法,只留在我的脑海里,它不会像预期的那样工作,而不是标志 - 只是抛出一个想法。

答案 1 :(得分:-1)

使用enum.ToString()来获得不友好的&#34; strings(其中enum是你的Enum变量)。编写一个可重用的扩展方法,将UnfriendlyString转换为友好的&#34;不友好的字符串&#34; (例如,只要有大写字母或类似内容,就插入空格 - 小写字母。)

对于[Flags],你可以Split不友好的字符串,转换每个子字符串,也许再次Join;或者你的扩展方法可以考虑逗号。