我有一个组合,其来源是Enum。现在,在其他值中(比如value1,value2
等。)有一个项目Changes(%)
将显示在组合中。
如何在枚举中定义更改(%)?
使用C#3.0
由于
答案 0 :(得分:8)
你做不到。枚举值名称必须是有效的C#标识符。你不应该试图在那里放置显示名称。
相反,请考虑使用[Description]
属性装饰每个值,您可以使用反射获取该属性:
public enum ChangeType
{
[Description("Changes (%)")]
PercentageChanges,
[Description("Changes (absolute)")]
AbsoluteChanges
}
或者定义资源,可能使用枚举值名称作为资源键。除了其他任何目的之外,这对于i18n目的会更好,但如果你不需要你的应用程序进行国际化,那么更多的工作。
答案 1 :(得分:0)
C#枚举编译为密封类,继承自Enum,公共静态字段带有枚举成员的名称,因此,您要求编译器将字段命名为“<”,“>”和“=”,这是不被接受的。
在命名时,枚举值与属性和字段具有相同的限制。
答案 2 :(得分:0)
FWIW ......本文深入探讨了实现Jon Skeet建议的确切方法>>>> ...... Pulling Enumeration Descriptions From A Resource File
答案 3 :(得分:0)
我使用Jon的方法(针对枚举的Description属性)以及下面显示的扩展方法,以便于检索描述:
public static class EnumExtensions
{
public static T GetAttribute<T>(this Enum enumerationValue) where T : Attribute
{
T[] attributes = GetAttributes<T>(enumerationValue);
return attributes.Length > 0 ? attributes[0] : null;
}
public static string GetDescription(this Enum enumerationValue, string descriptionIfNull = "")
{
if (enumerationValue != null)
{
DescriptionAttribute attribute = enumerationValue.GetAttribute<DescriptionAttribute>();
return attribute != null ? attribute.Description : enumerationValue.ToString();
}
return descriptionIfNull;
}
}
使用示例:
[TestClass]
public class WhenGettingDescriptionOfAnEnum
{
private enum SampleEnum
{
First,
[Description("description")]
Second
}
[TestMethod]
public void ShouldReturnNameOfEnumIfItHasNoDescription()
{
SampleEnum.First.GetDescription().Should().Be("First");
}
[TestMethod]
public void ShouldReturnDescriptionIfThereIsOne()
{
SampleEnum.Second.GetDescription().Should().Be("description");
}
}