首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅使用枚举的第一个字符转换为枚举

仅使用枚举的第一个字符转换为枚举
EN

Stack Overflow用户
提问于 2016-07-13 06:21:50
回答 6查看 1.2K关注 0票数 2

我有以下枚举:

代码语言:javascript
复制
public enum GenderContract
{
    Male,
    Female,
    Unknown
}

但是我从一个客户那里得到了'M','F‘和'U’的值。

是否有一种通用的方法将枚举的第一个字符转换为实际的枚举项?(假设名称中没有冲突?)

我有几个这样的场景,如果可能的话,我希望能够有一种通用的方法将部分匹配转换为枚举(而不是只做switch语句或类似的事情)。

EN

回答 6

Stack Overflow用户

发布于 2016-07-13 06:26:10

简单的解决方案是使用'M‘、'F’和'U‘的字符值

代码语言:javascript
复制
public enum GenderContract
{
    Male = 77, // 'M'
    Female = 70, // 'F'
    Unknown = 80 // 'U'
};

然后你只需要做

代码语言:javascript
复制
GenderContract c1 = (GenderContract)'M';
GenderContract c2 = (GenderContract)'F';
GenderContract c3 = (GenderContract)'U';
票数 5
EN

Stack Overflow用户

发布于 2016-07-13 06:26:13

您可能希望考虑使用DisplayAttribute,而不是依赖实际的枚举名称。使用它意味着您的枚举值与字符串值没有很强的关联。(也就是有人将女性更改为女性并不会破坏价值)。

代码语言:javascript
复制
public enum GenderContract
{
  [Display(ShortName="M")]
  Male,
  [Display(ShortName="F")]
  Female,
  [Display(ShortName="U")]
  Unknown
}

然后是一个简单的扩展方法:

代码语言:javascript
复制
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;
    }
}

用法:

代码语言:javascript
复制
Console.WriteLine(GenderContract.Male.ToShortName());

结果:

M

票数 4
EN

Stack Overflow用户

发布于 2016-07-13 06:39:01

我想,一个简单的方法就是使用像这样的字典

代码语言:javascript
复制
var lookupTable = Enum.GetValues(typeof(GenderContract)).Cast<GenderContract>()
                  .ToDictionary(x => x.ToString()[0], x => x);

然后,这将只是一个查找。

代码语言:javascript
复制
GenderContract e = lookupTable['M'];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38339799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档