C#使用枚举中的数字

问题描述 投票:35回答:7

这是一个有效的枚举

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,
};

是否可以在枚举中使用数字?我已经有可以从枚举中填充下拉列表的代码,因此非常方便]

c# syntax enums
7个回答
74
投票

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()

12
投票

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

应用程序可用性注释:在您的应用程序中,无论如何您都不应该向最终用户显示代码标识符。考虑将单个枚举项目转换为用户友好的可显示文本。迟早,您将必须使用其标识符不会以用户可显示的形式扩展项的枚举。

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


9
投票

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

[如果您可以修改使用枚举名称填充下拉列表的代码,则可能会有黑客在填充下拉列表并像这样定义枚举时剥去前导下划线:

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

或者,如果您不喜欢下划线,则可以使用自己的“要删除的前缀”方案(可以将前缀传递给构造器或方法,该方法将填充枚举中的下拉列表)。


4
投票

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


4
投票

枚举在命名规则方面与变量没有什么不同。因此,您不能以数字开头名称。从this post开始,这是变量命名的主要规则。

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

    • 名称的第一个字符必须是字母。下划线是也是合法的第一个字符,但其不建议在名称的开头。下划线是通常与特殊命令一起使用有时很难阅读。

    • 大小写(即大写和小写字母)。 C#是区分大小写;因此,名字很重要和Count指两个不同变量。

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


4
投票

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


-2
投票

这是我想出的选择,在这里我需要枚举在“ for”循环中使用,而字符串表示形式等效于在Linq查询中使用。

  1. 创建要在“ for”循环中使用的枚举名称空间。
public enum TrayLevelCodes
    {
        None,
        _5DGS,
        _5DG,
        _3DGS,
        _3DG,
        _AADC,
        _ADC,
        _MAAD,
        _MADC
    };
  1. 基于创建用于Linq查询的枚举创建字符串
public string _5DGS = "\"5DGS\"",
        _5DG = "\"5DG\"",
        _3DGS = "\"3DGS\"",
        _3DG = "\"3DG\"",
        _AADC = "\"AADC\"",
        _ADC = "\"ADC\"",
        _MAAD = "\"MAAD\"",
        _MADC = "\"MADC\"";
  1. 创建将枚举值作为参数并返回Linq查询的相应字符串的函数。
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. 这是我使用上面创建的内容的方式。
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)
    {

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.