带有Flags属性的友好枚举字符串

本文关键字:枚举 字符串 Flags 属性 带有 | 更新日期: 2023-09-27 18:06:27

在仔细阅读了一些关于在c#中为枚举值创建友好字符串访问的常见方法的其他问题之后,这个答案似乎是我对通用解决方案的最佳选择,其中友好字符串可以使用DescriptionAttribute s放置在枚举的定义中。

我将其实现为一个扩展方法,但很快意识到它只适用于没有指定[Flags]属性的标准枚举。对于存在该属性的情况,我不完全确定实现该功能的最佳方法。

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

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

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

我觉得这个问题可能是一个"鱼与熊掌兼得"的情况,因为我希望在获得友好字符串并删除代码后不必做额外的检查。有没有一种技巧或好方法可以做到这一点,而不是一个混乱的黑客?

带有Flags属性的友好枚举字符串

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

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());
}

不是最干净的代码,但你明白了,只记住我的想法,它不会像预期的那样工作,对于不是标志的枚举-只是抛出一个想法。

使用enum.ToString()获得"不友好"字符串(其中enum是您的enum变量)。编写一个可重用的扩展方法,将UnfriendlyString转换为友好的"不友好的字符串"(例如,在有大写或类似的地方插入空格小写)。

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