有没有一种简便的方法将C#枚举转换成字符串,再从字符串转回枚举?

3

我需要将枚举值的列表转换为单个字符串以存储在我的数据库中,然后在从数据库检索时再次转换回来。

每个枚举的值目前都是一个简单的整数,因此创建一个额外的表来处理这个问题似乎有点过度设计。

所以,在下面的示例中,如果用户选择了母亲、父亲和姐姐,则存储在数据库中的值将是“0,1,3”。

  public enum MyEnum
    {
        Mother = 0,
        Father = 1,
        Gran = 2,
        Sister = 3,
        Brother = 4
    }

我刚接触c#,不确定是否有一个方便的开箱即用的方法来实现这个功能 - 当我在谷歌上搜索时,没有找到明显的答案!

提前感谢您的帮助 :) - L

8个回答

10

枚举类型可以显式地转换为/从整数类型

int value = (int)MyEnum.Mother;

并且

   MyEnum value = (MyEnum)1;

对于字符串,请使用ToStringEnum.Parse

string value = MyEnum.Mother.ToString();

并且。
MyEnum value = (MyEnum)Enum.Parse(typeof(MyEnum),"Mother");

1
那些将是“int”,而不是所请求的“string”。 - Fredrik Mörk
@Fredrik但他也说明了如何转换为字符串? - Oskar Kjellin
@Oskar:我在发表评论时好像没有看到那部分,不过无论如何,我觉得我有点误读了问题;这似乎就是所要求的。 - Fredrik Mörk

4
如果你将枚举值更改为:
[Flags]
public enum MyEnum
    {
        Mother = 1,
        Father = 2,
        Gran = 4,
        Sister = 8,
        Brother = 16,
    }

你可以将Father和Gran存储为6,将Sister和Brother存储为24等

通过使用二进制数,您不应该通过组合它们获得重复的值


2
我很好奇你如何能同时成为姐姐和兄弟。 - Jamiec
@Jamiec 这与本题无关,因为您不知道选择一个值表示一个人就是那个值。 - Oskar Kjellin
太好了 - 我忘记了这个技巧! - laura
@Jamiec - 同时是姐妹和兄弟会被存储为24。 - WraithNath
@Jamiec - 刚刚意识到你的意思了!真是个双性人啊 - WraithNath

3

从您的代码来看,它是

MyEnum a = MyEnum.Mother;
string thestring = a.ToString();
MyEnum b = (MyEnum) Enum.Parse(typeof(MyEnum), thestring);

3
以下将按照要求通过“0,1,3”在枚举值数组之间进行转换:
MyEnum[] selection = { MyEnum.Mother, MyEnum.Father, MyEnum.Sister };

string str = string.Join(",", selection.Cast<int>());

MyEnum[] enm = str.Split(',').Select(s => int.Parse(s)).Cast<MyEnum>().ToArray();

3
只需使用ToString将其转换为名称,然后使用Enum.TryParse(如果您不在.NET 4上,则使用Enum.Parse)将其转换回来。
如果您想要一个枚举字段包含多个值(例如MyEnum.Mother | MyEnum.Father),则需要将其转换为Flags enum,如@WraithNath建议的那样。否则,您将需要分别存储每个选项(使用当前设置无法将和存储在同一字段中)。

1

字符串等价

MyEnum value = MyEnum.Father;
value.ToString(); // prints Father

解析

(MyEnum)Enum.Parse(typeof(MyEnum), "Father"); // returns MyEnum.Father

LOL:我喜欢这种情况发生。对彼此答案的评论相同。 - Chris Pfohl

0

Enum可以转换为整数值,这可能是您最好的选择。

如果您真的想使用字符串,ToString将返回"Mother" "Father" "Gran"等。从字符串转换回来只需要一个函数:

private MyEnum GetEnumValue(string fromDB)
{
    if( fromDB == "Mother" ) return MyEnum.Mother;
    else if( fromDB == "Father") return MyEnum.Father;
    //etc. etc.
}

编辑: Ian的回答对于类型转换来说是更符合"C#"的方式,而且更加灵活(可以更好地处理添加新值到枚举中的情况)。


0

根据Jamiec的建议(适合您的需求),如果您需要进行防御性编码,请尝试以下操作:

if (Enum.IsDefined(typeof(MyEnum), <your database value>))
{
    // Safe to convert your enumeration at this point:
    MyEnum value = (MyEnum)1;   
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接