我有一个简单的枚举:
enum E
{
FullNameForA = 1,
A = 1,
FullNameForB = 2,
B = 2
}
目标是能够对扭曲的相同整数值使用不同的字符串值 - 必须使用FullNameFor *作为默认值。换句话说,用户可以提供E.A作为输入,但代码应该使用E.FullNameForA进行输出。
似乎默认情况下C#将使用具有相同整数值的元素的字母顺序,这使我的目标更难。是对的吗?任何想法如何克服这个?
答案 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();
}
这当然不是表现最佳的解决方案,因为它依赖于反思。