【问题标题】:Numeric constants in enum (c#)枚举中的数字常量(c#)
【发布时间】:2011-03-14 14:06:05
【问题描述】:

我正在 SharePoint Web 部件中创建此选择框,并且需要有一个包含当前版本的下拉菜单,因此我需要使用枚举。

public enum SelectVersionEnum { 2010, 2007 };

你可以看到它在哪里中断,有没有办法在枚举中使用整数? 最重要的是我想使用

public enum SelectVersionEnum { 2010=14, 2007=12 };

【问题讨论】:

  • 下面的答案是正确的。花点时间考虑一下,即使 C# 允许这样做,这也是一个真的 坏主意和维护噩梦。这是最终将发布到 Daily WTF 的代码。

标签: c# enums constants numeric


【解决方案1】:

不,你不能用整数名称命名枚举。

枚举值名称是一个普通标识符,必须遵循与其他所有内容相同的规则。

但是,您可以使用:

public enum SelectVersionEnum
{
    Version2007 = 12,
    Version2010 = 14
}

此外,Enum.Parse 可以将带有整数的字符串解析为对应的枚举值,即使字符串中描述的值不存在。

LINQPad 中尝试以下操作:

void Main()
{
    Enum.Parse(typeof(SelectVersionEnum), "12").Dump();
    Enum.Parse(typeof(SelectVersionEnum), "14").Dump();
    Enum.Parse(typeof(SelectVersionEnum), "2007").Dump();
}

public enum SelectVersionEnum
{
    Version2007 = 12,
    Version2010 = 14
}

输出:

版本2007
版本2010
2007

如果您定义以下内容,您认为会发生什么:

public enum SelectVersionEnum
{
    12 = 14,
    14 = 16
}

字符串“14”现在的意思是“12”还是“14”?

【讨论】:

    【解决方案2】:

    枚举成员必须是有效的 C# 标识符。
    它们不能以数字开头。

    相反,您可以使用 Office2007, Office2010V2007, V2010 之类的名称。

    【讨论】:

      【解决方案3】:

      不,枚举标识符不能以数字字符开头。

      【讨论】:

        【解决方案4】:

        您可以像任何其他类型一样向枚举添加扩展方法。

        因此,您可以为 SelectVersionEnum 创建一个扩展,以帮助您以正确的格式获取枚举值...

        public static class SelectVersionEnumExtension
        {
             public static int Version(this SelectVersionEnum enumValue)
             {
                 return 0; // Obviously you should return something meaningful here..
             }
        }
        

        这为您提供了很大的灵活性。

        【讨论】:

          【解决方案5】:

          您可以将数值与枚举关联的一种方法是使用 description 属性。例如,您可能有枚举:

          [Serializable]
          public enum SelectVersionEnum
          {
              [Description("2007")]
              v2007,
              [Description("2010")]
              v2010
          }
          

          然后您可以编写一个扩展方法来获取您要查找的数值。

          public static string Description(this Enum value)
          {
              var type = value.GetType();
          
              var name = Enum.GetName(type, value);
          
              if (name != null)
              {
                  if (type.GetField(name) != null)
                  {
                      var attr = Attribute.GetCustomAttribute(type.GetField(name), typeof(DescriptionAttribute)) as DescriptionAttribute;
          
                      return attr != null ? attr.Description : name;
                  }
              }
          
              return null;
          
          } // end
          

          你会这样使用它:

          var version = SelectVersionEnum.v2007.Description();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-08-15
            • 2017-03-06
            • 2011-07-09
            • 1970-01-01
            • 1970-01-01
            • 2015-08-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多