我需要将以下代码放入枚举中:
10, 11, 13, AA, BB, EE
我很难将它们放入 C# 中的枚举中。我目前有这个:
public enum REASON_CODES { _10, _11, _13, AA, BB, CC }
但想要这个,数字被识别为字符串,而不是整数:
public enum REASON_CODES { 10, 11, 13, AA, BB, CC }
这是可能的还是我在做梦?
我需要将以下代码放入枚举中:
10, 11, 13, AA, BB, EE
我很难将它们放入 C# 中的枚举中。我目前有这个:
public enum REASON_CODES { _10, _11, _13, AA, BB, CC }
但想要这个,数字被识别为字符串,而不是整数:
public enum REASON_CODES { 10, 11, 13, AA, BB, CC }
这是可能的还是我在做梦?
尝试使用枚举和DescriptionAttribute
:
public enum REASON_CODES
{
[Description("10")]
HumanReadableReason1,
[Description("11")]
SomethingThatWouldMakeSense,
/* etc. */
}
然后,您可以使用帮助器(如Enumerations.GetDescription
)来获取“真实”值(同时保持在 C# 命名约束内)。
为了使它成为一个完整的答案:
以防万一有人想要一个与这两个海报结合的扩展类:
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# 中的普通变量相同的命名规则。
请检查这个问题我的枚举可以有友好的名字吗?