C# 将枚举转换为人类可读的值

C# 将枚举转换为人类可读的值,c#,enums,human-readable,C#,Enums,Human Readable,有人知道如何将枚举值转换为人类可读的值吗 例如: ThisIsValueA应该是“ThisIsValueA” 我见过的大多数例子都涉及到用[Description]属性标记枚举值,并使用反射在值和描述之间进行“转换”。这里有一篇关于它的老博文: 您也可以看看这篇文章: 它特别是关于数据绑定的,但是展示了如何使用属性来修饰枚举值,并提供了一个“GetDescription”方法来检索属性的文本。使用内置描述属性的问题在于该属性还有其他用途/用户,因此描述可能出现在您不希望出现的地方。自定义属性解决

有人知道如何将枚举值转换为人类可读的值吗

例如:

ThisIsValueA应该是“ThisIsValueA”


我见过的大多数例子都涉及到用[Description]属性标记枚举值,并使用反射在值和描述之间进行“转换”。这里有一篇关于它的老博文:


您也可以看看这篇文章:

它特别是关于数据绑定的,但是展示了如何使用属性来修饰枚举值,并提供了一个“GetDescription”方法来检索属性的文本。使用内置描述属性的问题在于该属性还有其他用途/用户,因此描述可能出现在您不希望出现的地方。自定义属性解决了这个问题。

您可以从System.Reflection的“attribute”类继承来创建自己的“Description”类。像这样(来自):


转换从一个vb代码片段,某个特定的Horian将留在一个。。。我已经成功地在生产中使用了它

    /// <summary>
    /// Add spaces to separate the capitalized words in the string, 
    /// i.e. insert a space before each uppercase letter that is 
    /// either preceded by a lowercase letter or followed by a 
    /// lowercase letter (but not for the first char in string). 
    /// This keeps groups of uppercase letters - e.g. acronyms - together.
    /// </summary>
    /// <param name="pascalCaseString">A string in PascalCase</param>
    /// <returns></returns>
    public static string Wordify(string pascalCaseString)
    {            
        Regex r = new Regex("(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])");
        return r.Replace(pascalCaseString, " ${x}");
    }
会回来,

"This Is Value A".
与提供描述属性相比,它更简单,冗余更少


只有当您需要提供一层间接寻址(这不是问题所要求的)时,属性在这里才有用。

我发现最好用一个低分来定义枚举值,这样thisValueA就是This\u Is\u Value\u,然后您就可以只做一个enumValue.toString().Replace(“\u”,”)其中enumValue是您的变量。

Enums上的.ToString在C#中相对较慢,与GetType().Name相当(它甚至可能在封面下使用它)

如果您的解决方案需要非常快速或高效,您最好将转换缓存在静态字典中,并从那里查找它们


对@Leon代码的一个小修改,以利用C#3。作为枚举的扩展,这是有意义的——如果不想把所有枚举都弄乱,可以将其限制为特定类型

public static string Wordify(this Enum input)
{            
    Regex r = new Regex("(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])");
    return r.Replace( input.ToString() , " ${x}");
}

//then your calling syntax is down to:
MyEnum.ThisIsA.Wordify();
公共静态字符串Wordify(此枚举输入)
{            

Regex r=new Regex((?为每个枚举添加
Description
属性的替代方法是创建一个扩展方法。要重新使用Adam的“Coolness”枚举:


尽管这意味着描述与实际值相差甚远,但它允许您使用本地化为每种语言打印不同的字符串,例如在my
VeryCool
示例中。

当描述属性在System.ComponentModel命名空间中已经可用时,为什么要创建它
"This Is Value A".
public static string Wordify(this Enum input)
{            
    Regex r = new Regex("(?<=[a-z])(?<x>[A-Z])|(?<=.)(?<x>[A-Z])(?=[a-z])");
    return r.Replace( input.ToString() , " ${x}");
}

//then your calling syntax is down to:
MyEnum.ThisIsA.Wordify();
public enum Coolness
{
    NotSoCool,
    Cool,
    VeryCool,
    SuperCool
}

public static class CoolnessExtensions
{
    public static string ToString(this Coolness coolness)
    {
        switch (coolness)
        {
            case Coolness.NotSoCool:
                return "Not so cool";
            case Coolness.Cool:
                return "Cool";
            case Coolness.VeryCool:
                return "Very cool";
            case Coolness.SuperCool:
                return Properties.Settings.Default["SuperCoolDescription"].ToString();
            default:
                throw new ArgumentException("Unknown amount of coolness", nameof(coolness));
        }
    }
}