使用相同的整数值对C#枚举中的元素进行排序

时间:2012-07-24 18:59:49

标签: c# .net

我有一个简单的枚举:

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

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

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

2 个答案:

答案 0 :(得分:6)

  

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

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

  

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

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

我建议如果您想要为每个值添加规范字符串表示形式,请创建Dictionary<E, string>并咨询该字符串,而不是调用ToString()

答案 1 :(得分: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();
}

这当然不是表现最佳的解决方案,因为它依赖于反思。