2012-07-24 73 views
2

我有一个简单枚举:订购具有相同的整数值在C#枚举元素

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

我们的目标是能够为与一捻相同积分值使用不同的字符串值 - FullNameFor *必须被用作默认值。换句话说,用户可以提供E.A作为输入,但代码应该使用E.FullNameForA来输出。

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

+0

谁是您的用户?他们是开发者吗? – Tigran 2012-07-24 19:03:54

+0

不,外部API。 – Schultz9999 2012-07-24 19:13:38

回答

6

好像默认为C#将使用元素的字母排序用相同的积分值

在什么情况下?当你将值转换回字符串?从Enum.ToString文档:

如果多个枚举成员具有相同的基础值,并尝试获取基于其基础值的枚举成员名称的字符串表示,你的代码不应该做任何假设哪名该方法将返回。

(请注意,这一决定是在BCL - 它不是一个语言决定。)

我建议,如果你想为每个值规范字符串表示,创建一个Dictionary<E, string>和请咨询,而不是致电ToString()

+0

是的,ToString使用第一个元素。字典可能是最简单的。我想过使用最长的一个,因为同一个int的所有值中只有一个真的是完整和冗长的。但是这将需要对我不特别喜欢的枚举成员进行大量迭代。拥有静态字典消除了这种开销。 – Schultz9999 2012-07-24 19:10:28

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

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

+0

有趣的想法。基本上由Jon Skeet提出的集成词典。 – Schultz9999 2012-07-24 19:12:48