在c#中强制enum将number识别为字符串

本文关键字:number 识别 字符串 enum | 更新日期: 2023-09-27 18:18:49

我需要将以下代码放入enum中:

 10, 11, 13, AA, BB, EE

我很难在c#中将它们放入枚举中。我现在有这个:

 public enum REASON_CODES { _10, _11, _13, AA, BB, CC }

,但希望有这个,与数字被识别为字符串,而不是int:

 public enum REASON_CODES { 10, 11, 13, AA, BB, CC }

这是可能的还是我在做梦?

在c#中强制enum将number识别为字符串

尝试使用枚举和DescriptionAttribute:

public enum REASON_CODES
{
    [Description("10")]
    HumanReadableReason1,
    [Description("11")]
    SomethingThatWouldMakeSense,
    /* etc. */
}

然后你可以使用一个助手(如Enumerations.GetDescription)来获得"真实"的值(同时保持在c#命名约束内)。

给出一个完整的答案:

  • @BryanRowe写了一个enumto - description方法
    https://stackoverflow.com/a/1799401/298053
  • @max写了一个Description-to-Enum方法
    https://stackoverflow.com/a/4367868/298053

以防有人想要一个结合这两个海报的扩展类:

public static class EnumExtensions
{
    public static String ToDescription<TEnum>(this TEnum e) where TEnum : struct
    {
        var type = typeof(TEnum);
        if (!type.IsEnum) throw new InvalidOperationException("type must be an enum");
        var memInfo = type.GetMember(e.ToString());
        if (memInfo != null & memInfo.Length > 0)
        {
            var descAttr = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (descAttr != null && descAttr.Length > 0)
            {
                return ((DescriptionAttribute)descAttr[0]).Description;
            }
        }
        return e.ToString();
    }
    public static TEnum ToEnum<TEnum>(this String description) where TEnum : struct
    {
        var type = typeof(TEnum);
        if (!type.IsEnum) throw new InvalidOperationException("type must be an enum");
        foreach (var field in type.GetFields())
        {
            var descAttr = field.GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (descAttr != null && descAttr.Length > 0)
            {
                if (((DescriptionAttribute)descAttr[0]).Description == description)
                {
                    return (TEnum)field.GetValue(null);
                }
            }
            else if (field.Name == description)
            {
                return (TEnum)field.GetValue(null);
            }
        }
        return default(TEnum); // or throw new Exception();
    }
}

:

public enum CODES
{
    [Description("11")]
    Success,
    [Description("22")]
    Warning,
    [Description("33")]
    Error
}
// to enum
String response = "22";
CODES responseAsEnum = response.ToEnum<CODES>(); // CODES.Warning
// from enum
CODES status = CODES.Success;
String statusAsString = status.ToDescription(); // "11"

在c#中,标识符必须以字母或下划线开头。没有办法做到这一点。你的第一个解决方案是你能得到的最接近的。

http://msdn.microsoft.com/en-us/library/aa664670 (v = vs.71) . aspx

枚举值的名称必须遵循与c#中普通变量相同的命名规则。

我的枚举可以有友好的名字吗?