C#使用枚举中的数字

时间:2010-10-12 16:30:43

标签: c# syntax enums

希望快点。

这是一个有效的枚举

public enum myEnum
{
  a= 1,
  b= 2,
  c= 3,
  d= 4,
  e= 5,
  f= 6,
  g= 7,
  h= 0xff
};

但这不是

public enum myEnum
{
  1a = 1,
  2a = 2,
  3a = 3,
};

有没有办法可以在枚举中使用数字。我已经有了代码来填充枚举下拉列表,因此它非常方便

8 个答案:

答案 0 :(得分:71)

C#中根本没有标识符可以以数字开头(出于词汇/解析的原因)。考虑在枚举值中添加[Description]属性:

public enum myEnum
{
    [Description("1A")]
    OneA = 1,
    [Description("2A")]
    TwoA = 2,
    [Description("3A")]
    ThreeA = 3,
};

然后你可以从这样的枚举值中得到描述:

((DescriptionAttribute)Attribute.GetCustomAttribute(
    typeof(myEnum).GetFields(BindingFlags.Public | BindingFlags.Static)
        .Single(x => (myEnum)x.GetValue(null) == enumValue),    
    typeof(DescriptionAttribute))).Description

根据下面的XSA评论,我想扩展一下如何让它更具可读性。最简单的说,你可以创建一个静态(扩展)方法:

public static string GetDescription(this Enum value)
{
    return ((DescriptionAttribute)Attribute.GetCustomAttribute(
        value.GetType().GetFields(BindingFlags.Public | BindingFlags.Static)
            .Single(x => x.GetValue(null).Equals(value)),
        typeof(DescriptionAttribute)))?.Description ?? value.ToString();
}

由您决定是否要将其作为扩展方法,并且在上面的实现中,如果没有提供[DescriptionAttribute],我已经使其回退到枚举的正常名称。

现在,您可以通过以下方式获取枚举值的说明:

myEnum.OneA.GetDescription()

答案 1 :(得分:11)

不,没有。 C#不允许标识符以数字开头。

应用程序可用性说明:在您的应用程序中,您不应该向最终用户显示代码标识符。考虑将单个枚举项目翻译成用户友好的可显示文本。迟早你必须使用一个项目来扩展枚举,该项目的标识符不会以用户可以显示的形式显示。

更新:请注意,正在讨论将可显示文本附加到枚举项目的方法,例如here

答案 2 :(得分:8)

C#(和大多数语言)中的标识符不能以数字开头。

如果您可以修改使用枚举名称填充下拉列表的代码,则可能会在填充下拉列表时删除前导下划线并修改枚举,如下所示:

public enum myEnum
{
  _1a = 1,
  _2a = 2,
  _3a = 3
};

或者,如果你不喜欢下划线,你可以想出你自己的'前缀被剥离'方案(可能将前缀传递给构造函数或方法,它将填充枚举中的下拉列表)。< / p>

答案 3 :(得分:4)

没办法。有效的标识符(即有效的枚举成员)不能以数字开头。

答案 4 :(得分:4)

在命名规则方面,枚举与变量没有什么不同。因此,您无法使用数字启动名称。从this post开始,以下是变量命名的主要规则。

  • 名称可以包含字母,数字和下划线字符 (_)。

    • 名称的第一个字符必须是字母。下划线是 也是一个合法的第一个角色,但它 建议不要使用 一个名字的开头。下划线是 经常与特殊命令一起使用,和 它有时难以阅读。

    • 案件事项(即大写和小写字母)。 C#是 区分大小写;因此,这些名字很重要 和伯特指的是两个不同的 变量

    • C#关键字不能用作变量名。回想一下关键字 是一个单词,是C#的一部分 语言。 (C#的完整列表 关键字可以在附录B中找到, “C#关键字。”)

答案 5 :(得分:4)

标识符不能以数字开头。但是,它们可以包含数字。

答案 6 :(得分:1)

简短的4行代码。

我们只是将枚举用作代码中项目的命名整数,

所以任何简单的方法都可以。

public enum myEnum
{
    _1A = 1,
    _2A,
    _3A,
};

也用于十进制值

public enum myEnum
{
    _1_5 = 1,
    _2_5,
    _3_5,
};

因此,在代码中使用它时,

int i = cmb1.SelectedIndex(0); // not readable
int i = cmb1.SelectedIndex( (int) myEnum._1_5); // readable

答案 7 :(得分:-2)

以下是我提出的替代方案,我需要在“for”循环中使用Enums以及相当于在Linq查询中使用的字符串表示。

  
      
  1. 创建要在“for”循环中使用的枚举命名空间。
  2.   
public enum TrayLevelCodes
    {
        None,
        _5DGS,
        _5DG,
        _3DGS,
        _3DG,
        _AADC,
        _ADC,
        _MAAD,
        _MADC
    };
  
      
  1. 基于创建用于Linq查询的枚举创建字符串
  2.   
public string _5DGS = "\"5DGS\"",
        _5DG = "\"5DG\"",
        _3DGS = "\"3DGS\"",
        _3DG = "\"3DG\"",
        _AADC = "\"AADC\"",
        _ADC = "\"ADC\"",
        _MAAD = "\"MAAD\"",
        _MADC = "\"MADC\"";
  
      
  1. 创建将枚举值作为参数的函数,并返回Linq查询的相应字符串。
  2.   
public string GetCntnrLvlDscptn(TrayLevelCodes enumCode)
        {
            string sCode = "";
            switch (enumCode)
            {
                case TrayLevelCodes._5DGS:
                    sCode = "\"5DGS\"";
                    break;
                case TrayLevelCodes._5DG:
                    sCode = "\"5DG\"";
                    break;
                case TrayLevelCodes._3DGS:
                    sCode = "\"3DGS\"";
                    break;
                case TrayLevelCodes._3DG:
                    sCode = "\"3DG\"";
                    break;
                case TrayLevelCodes._AADC:
                    sCode = "\"AADC\"";
                    break;
                case TrayLevelCodes._ADC:
                    sCode = "\"AAC\"";
                    break;
                case TrayLevelCodes._MAAD:
                    sCode = "\"MAAD\"";
                    break;
                case TrayLevelCodes._MADC:
                    sCode = "\"MADC\"";
                    break;
                default:
                    sCode = "";
                    break;
            }
                return sCode;
        }
  
      
  1. 以下是我使用上面创建的内容。
  2.   
for (var trayLevelCode = TrayLevelCodes._5DGS; trayLevelCode <= TrayLevelCodes._MADC; trayLevelCode++)
{
    var TrayLvLst = (from i in pair1.Value.AutoMap
                     where (i.TrayLevelCode == HTMLINFO.GetCntnrLvlDscptn(trayLevelCode))
                     orderby i.TrayZip, i.GroupZip
                     group i by i.TrayZip into subTrayLvl
                     select subTrayLvl).ToList();
    foreach (DropShipRecord tray in TrayLvLst)
    {

    }
}