在Enum中使用特殊字符,例如%(C#3.0)

时间:2010-08-17 11:00:18

标签: c# enums attributes naming-conventions

我有一个组合,其来源是Enum。现在,在其他值中(比如value1,value2

等。)有一个项目Changes(%)将显示在组合中。

如何在枚举中定义更改(%)?

使用C#3.0

由于

4 个答案:

答案 0 :(得分:8)

你做不到。枚举值名称必须是有效的C#标识符。你不应该试图在那里放置显示名称。

相反,请考虑使用[Description]属性装饰每个值,您可以使用反射获取该属性:

public enum ChangeType
{
    [Description("Changes (%)")]
    PercentageChanges,

    [Description("Changes (absolute)")]
    AbsoluteChanges
}

或者定义资源,可能使用枚举值名称作为资源键。除了其他任何目的之外,这对于i18n目的会更好,但如果你不需要你的应用程序进行国际化,那么更多的工作。

编辑:Here's an article going into more detail

答案 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");
  }
}