2

我有一个简单的枚举:

enum E
{
    FullNameForA = 1,
    A = 1,
    FullNameForB = 2,
    B = 2
}

目标是能够对相同的整数值使用不同的字符串值,但必须使用 FullNameFor* 作为默认值。换句话说,用户可以提供 EA 作为输入,但代码应该使用 E.FullNameForA 作为输出。

似乎默认情况下 C# 将使用具有相同整数值的元素按字母顺序排列,这使我的目标更加困难。是对的吗?任何想法如何克服这个问题?

4

2 回答 2

6

似乎默认情况下 C# 将使用具有相同整数值的元素的字母顺序

在什么情况下?当您将值转换回字符串时?来自以下文档Enum.ToString

如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,则您的代码不应对该方法将返回哪个名称做出任何假设。

(请注意,该决定在 BCL 中 - 这不是语言决定。)

我建议,如果您想要每个值的规范字符串表示,您可以创建一个Dictionary<E, string>并查阅它,而不是调用ToString().

于 2012-07-24T19:02:45.143 回答
2

考虑这个替代解决方案。您可以使用 DescriptionAttribute 装饰枚举值并使用更人性化的名称:

enum E
{
    [System.ComponentModel.Description("FullNameForA")]
    A = 1
}

然后您可以像这样提取该属性的值:

public static string AsString(this Enum value)
{
    var type = value.GetType();

    if (!type.IsEnum)
        throw new ArgumentException();

    var fieldInfo = type.GetField(value.ToString());
    if (fieldInfo == null) 
        return value.ToString();

    var attribs = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[];

    return attribs.Length > 0 ? attribs[0].Description : value.ToString();
}

这当然不是性能最好的解决方案,因为它依赖于反射。

于 2012-07-24T19:04:11.117 回答