我有一个简单的枚举:
enum E
{
FullNameForA = 1,
A = 1,
FullNameForB = 2,
B = 2
}
目标是能够对相同的整数值使用不同的字符串值,但必须使用 FullNameFor* 作为默认值。换句话说,用户可以提供 EA 作为输入,但代码应该使用 E.FullNameForA 作为输出。
似乎默认情况下 C# 将使用具有相同整数值的元素按字母顺序排列,这使我的目标更加困难。是对的吗?任何想法如何克服这个问题?
似乎默认情况下 C# 将使用具有相同整数值的元素的字母顺序
在什么情况下?当您将值转换回字符串时?来自以下文档Enum.ToString:
如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,则您的代码不应对该方法将返回哪个名称做出任何假设。
(请注意,该决定在 BCL 中 - 这不是语言决定。)
我建议,如果您想要每个值的规范字符串表示,您可以创建一个Dictionary<E, string>并查阅它,而不是调用ToString().
考虑这个替代解决方案。您可以使用 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();
}
这当然不是性能最好的解决方案,因为它依赖于反射。