我有以下枚举:
public enum GenderContract
{
Male,
Female,
Unknown
}但是我从一个客户那里得到了'M','F‘和'U’的值。
是否有一种通用的方法将枚举的第一个字符转换为实际的枚举项?(假设名称中没有冲突?)
我有几个这样的场景,如果可能的话,我希望能够有一种通用的方法将部分匹配转换为枚举(而不是只做switch语句或类似的事情)。
发布于 2016-07-13 06:26:10
简单的解决方案是使用'M‘、'F’和'U‘的字符值
public enum GenderContract
{
Male = 77, // 'M'
Female = 70, // 'F'
Unknown = 80 // 'U'
};然后你只需要做
GenderContract c1 = (GenderContract)'M';
GenderContract c2 = (GenderContract)'F';
GenderContract c3 = (GenderContract)'U';发布于 2016-07-13 06:26:13
您可能希望考虑使用DisplayAttribute,而不是依赖实际的枚举名称。使用它意味着您的枚举值与字符串值没有很强的关联。(也就是有人将女性更改为女性并不会破坏价值)。
public enum GenderContract
{
[Display(ShortName="M")]
Male,
[Display(ShortName="F")]
Female,
[Display(ShortName="U")]
Unknown
}然后是一个简单的扩展方法:
public static class EnumExtensions
{
public static TAttribute GetAttributeOrDefault<TAttribute>(this Enum enumVal)
where TAttribute : Attribute
{
var type = enumVal.GetType();
var memInfo = type.GetMember(enumVal.ToString());
var result = memInfo[0].GetCustomAttributes(typeof(TAttribute), false)
.FirstOrDefault() as TAttribute;
return result;
}
public static string ToName(this Enum value)
{
var result = value.ToString();
var attribute = value.GetAttributeOrDefault<DisplayAttribute>();
if (attribute != null)
{
result = attribute.Name;
}
return result;
}
public static string ToShortName(this Enum value)
{
var result = value.ToString();
var attribute = value.GetAttributeOrDefault<DisplayAttribute>();
if (attribute != null)
{
result = attribute.ShortName;
}
return result;
}
}用法:
Console.WriteLine(GenderContract.Male.ToShortName());结果:
M
发布于 2016-07-13 06:39:01
我想,一个简单的方法就是使用像这样的字典
var lookupTable = Enum.GetValues(typeof(GenderContract)).Cast<GenderContract>()
.ToDictionary(x => x.ToString()[0], x => x);然后,这将只是一个查找。
GenderContract e = lookupTable['M'];https://stackoverflow.com/questions/38339799
复制相似问题