将字符串转换为枚举

时间:2014-01-23 06:17:18

标签: c# wcf enums

enter image description here

我正在处理WCF服务,并希望将首选项键作为枚举而不是字符串返回。

如何以最佳方式制作字符串类型的preferencekey列的枚举?

5 个答案:

答案 0 :(得分:8)

您应该使用enum.Parse方法:

MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), enumString);

我找到了代码段: http://dotnet-snippets.de/snippet/string-zu-enum/1012

答案 1 :(得分:2)

罗希特夏尔,

preferenceKey的值无法像您期望的那样轻松转换为枚举。可以使用Enum.Parse()方法解析字符串,但枚举名称必须与数据库中的名称不同。问题是

  1. 您的字符串以数字
  2. 开头
  3. 您的字符串包含-个字符
  4. 现在有人说你可以设计一种不同的方法来命名enum的枚举作为一个例子(我个人不喜欢这个例子,但可能有用)。

    首先定义一个名为EnumName的新属性,该属性将用于使用您期望从数据库中获取的名称来装饰您的枚举。如

    [AttributeUsage(AttributeTargets.Field, AllowMultiple = true)]
    public sealed class EnumNameAttribute : Attribute
    {
        readonly string name;
    
        public EnumNameAttribute(string name)
        {
            this.name = name;
        }
    
        public string Name { get { return this.name; } }
    }
    

    下一步将是定义你的枚举(我不喜欢的是名字)

    public enum Preferences
    {
        [EnumName("6E-SF-TYPE")]
        SIX_E_SF_TYPE = 0,
        [EnumName("6E-SF-VALUE")]
        SIX_E_SF_VALUE = 1
    }
    

    很简单,我们的枚举中包含用EnumName属性修饰的每个项目。下一步是创建一个方法,根据数据库中的字符串解析枚举。

    public static class EnumNameParser
    {
        public static Preferences ParseString(string enumString)
        {
            var members = typeof(Preferences).GetMembers()
                                                .Where(x => x.GetCustomAttributes(typeof(EnumNameAttribute), false).Length > 0)
                                                .Select(x =>
                                                    new
                                                    {
                                                        Member = x,
                                                        Attribute = x.GetCustomAttributes(typeof(EnumNameAttribute), false)[0] as EnumNameAttribute
                                                    });
    
            foreach(var item in members)
            {
                if (item.Attribute.Name.Equals(enumString))
                    return (Preferences)Enum.Parse(typeof(Preferences), item.Member.Name);
            }
    
            throw new Exception("Enum member " + enumString + " was not found.");
        }
    }
    

    此方法只接受输入流,评估所有EnumNameAttributes并返回第一个匹配(如果未找到则返回异常)。

    然后可以这样称为。

    string enumString = "6E-SF-TYPE";
    var e = EnumNameParser.ParseString(enumString);
    

    现在,如果您想获取枚举并获取数据库的名称,您可以使用

    扩展您的帮助方法
    public static string GetEnumName(this Preferences preferences)
    {
        var memInfo = typeof(Preferences).GetMember(preferences.ToString());
        if (memInfo != null && memInfo.Length > 0)
        {
            object[] attrs = memInfo[0].GetCustomAttributes(typeof(EnumNameAttribute), false);
            if (attrs != null && attrs.Length > 0)
                return ((EnumNameAttribute)attrs[0]).Name;
        }
        throw new Exception("No enum name attribute defined");
    
    }
    

答案 2 :(得分:1)

我真的建议在数据库中存储数值而不是文本值。如果您还想要数据库中的文本值,那么为它添加一个表。无论如何,Enum.Parse和.TryParse方法将转换String,而.ToObject方法将转换文本或数字。

答案 3 :(得分:1)

  

如何以最佳方式制作字符串类型的preferencekey列的枚举

好吧,我担心你不能使用你的偏好键作为枚举有两个原因。

  1. 您的首选项键以整数值开头,使其成为无效的标识符。
  2. 它还包含 - ,也是不允许的。
  3. 但是,如果您能够将首选项密钥转换为某些有效标识符,则可以执行此操作。

    我建议使用Enum.TryParse进行解析,因为

      

    TryParse(String,Boolean,TEnum)与Parse(Type,String,Boolean)方法相同,不同之处在于,如果转换失败,它将返回false,而不是抛出异常。在解析枚举值的字符串表示时,它消除了异常处理的需要。

    像这样的东西

    string testingString = "Test1";
    SomeEnum result;
    if (Enum.TryParse(testingString, out result))
    {
        Console.WriteLine("Success");
    }
    

    或者如果区分大小写对您无关紧要。然后你可以像这样使用重载

    if (Enum.TryParse(testingString,true, out result))    
       Console.WriteLine("Success");
    

    其中SomeEnum是

    public enum SomeEnum
        {
            Test1 = 1,
            Test2 = 2
        }
    

答案 4 :(得分:0)

这样做的简单方法是:

1)创建一个表示所有可能的首选项键值的枚举,但添加值为-1的“无效”。

enum PreferenceKey
{
    INVALID = -1,
    SIX_E_SF_TYPE = 0,
    SIX_E_SF_VALUE = 1,
    ...
}

2)创建一个字符串列表,其中包含所有首选项键值的字符串表示形式,其顺序与枚举相同。

private List<string> strings = new List<string> {"6E-SF-TYPE", "6E-SF-VALUE", ...};

3)查找字符串列表中的列值并将位置转换为枚举。 如果在字符串列表中找不到列值,则IndexOf将返回-1,这是“无效”值。

PreferenceKey key = (PreferenceKey) strings.IndexOf(preferenceKeyColumnValue);