在C#中将字符串转换为枚举类型?

时间:2013-02-07 18:17:46

标签: c# .net string enums type-conversion

我想保留当前所选的组合框值,并在以后恢复它。要管理组合框中的值,我有一个带有描述属性的枚举类型。 description属性在运行时变为(一个)组合框字符串值,并且与其关联的枚举常量在内部用于编程目的。我从以下Stack Overflow帖子中获得了这项技术:

c#:How to use enum for storing string constants?

该帖子在本博文的一条评论中包含一个链接:

http://weblogs.asp.net/grantbarrington/archive/2009/01/19/enumhelper-getting-a-friendly-description-from-an-enum.aspx

在这里从该帖子复制执行枚举到字符串转换魔法的GetDescription()方法,并在参数列表中添加“this”关键字,这样我就可以将它用作枚举类型的扩展方法: / p>

    public static string GetDescription(this Enum en)
    {
        Type type = en.GetType();

        MemberInfo[] memInfo = type.GetMember(en.ToString());

        if (memInfo != null && memInfo.Length > 0)
        {
            object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (attrs != null && attrs.Length > 0)
            {
                return ((DescriptionAttribute)attrs[0]).Description;
            }
        }

        // Unable to find a description attribute for the enum.  Just return the
        //  value of the ToString() method.
        return en.ToString();
    }

所以我将方程式的一面完全充实,并且效果很好。现在我想走另一条路。我想创建一个方法,该方法接受一个字符串并通过遍历特定枚举类型的description属性返回正确的枚举值,并返回与该字符串匹配的description属性关联的枚举值。假设的方法声明是:

public static Enum GetEnumValue(string str){}

然而,该声明的直接问题是它不返回特定的枚举类型。我不确定如何正确声明和转换,以便返回正确的枚举类型。是否可以为GetDescription()方法创建这种补充方法,如果是这样,我如何制作它以便它可以方便地用于任何特定的枚举类型?如果我能做到这一点,我将有一个方便的解决方案,解决在用于持久控制设置的字符串之间进行转换然后在以后恢复它们的常见问题,所有这些都由枚举支持。

1 个答案:

答案 0 :(得分:3)

你缺少一条信息,Enum要看什么。

目前,您只传入一个字符串,但不传递Enum的类型。

最简单的方法是使用通用函数

请注意,此内容不在袖口内,甚至可能无法编译。

public static TEnum GetEnumValue<TEnum>(string str)
    where TEnum : struct //enum is not valid here, unfortunately
{
    foreach (MemberInfo memInfo in typeof(TEnum).GetMembers())
    {
        object[] attrs = memInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);

        if (attrs != null && attrs.Length > 0)
        {
            if (((DescriptionAttribute)attrs[0]).Description == str)
            {
                return (TEnum)(object)Enum.Parse(typeof(TEnum),memInfo.Name);
            }
        }
    }

    // Unable to find a description attribute for the enum.
    return (TEnum)(object)Enum.Parse(typeof(TEnum),str);
}

然后,您可以使用typeof(TEnum)获取所请求枚举的类型对象,并执行您的逻辑。

最后,您可以在返回之前回到TEnum,从而节省自己在主叫方面的工作。

编辑:

添加了粗略示例,未经测试。