从值类型获取小写字符串,而无需先转换为字符串

时间:2019-06-14 01:43:30

标签: c#

我有一个enum。我需要获取此enum的小写字符串表示形式。有没有一种方法可以获取小写而不必先创建2个字符串,即enum.ToString().ToLower()。有没有FormatProvider我可以传递给ToString来创建一个小写的字符串而已

3 个答案:

答案 0 :(得分:0)

我认为,没有某种ToString()方法,就无法通过非字符串值使用String的ToLower()方法。 如果是语法问题,则可以将其作为扩展方法:

public static string ToLowerString(this YourEnum enumValue) => enumValue.ToString().ToLower();

并这样称呼:

YourEnum.SomeEnumValue.ToLowerString();

编辑。

由于OP表示他/她正试图避免开销,所以我猜Theodor(Dictionary<YourEnum, string>)建议的Dictionary方法是更好的解决方案。

答案 1 :(得分:0)

您可以构建一个查找字典,在启动时(或第一次需要时)对其进行一次初始化,然后使用它来获取小写值:

public static Dictionary<TEnum, string> BuildEnumToStringMapping<TEnum>()
    where TEnum: struct
{
        if (!typeof(TEnum).IsEnum)
        {
            throw new ArgumentException("TEnum is not an enum.");
        }

        return Enum.GetValues(typeof(TEnum))
            .OfType<TEnum>()
            .ToDictionary(e => e, e => e.ToString().ToLower());
}

用法:

var lookup = BuildEnumToStringMapping<MyEnum>();
Console.WriteLine(lookup[MyEnum.Value]);

Try it online

答案 2 :(得分:0)

没有很多方法可以实现此目的,因为您不希望使用两个字符串(使用ToString().ToLower()的可能性将消失)。

我建议使用命名空间DescriptionAttribute中的System.ComponentModel

DescriptionAttribute添加到枚举的每个成员。

public enum Items
{
    [Description("item1")]
    Item1 = 1,

    [Description("item2")]
    Item2 = 2,
}

然后在需要时使用Reflection获得友好的小写字母名称。

public static string GetDescription(Enum en)
{
    Type type = en.GetType();

    MemberInfo[] memInfo = type.GetMember(en.ToString());

    if (memInfo != null && memInfo.Length > 0)
    {
        object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

        if (attrs != null && attrs.Length > 0)
        {
            return ((DescriptionAttribute)attrs[0]).Description;
        }
    }

    return en.ToString();
}

参考:查看this了解更多详细信息。