如何在C#中将字符串转换为标志(Flags)枚举格式

5

我有这个枚举:

[Flags]
public enum Countries
{
    None    = 0,
    USA     = 1,
    Mexico  = 2,
    Canada  = 4,
    Brazil  = 8,
    Chile   = 16
}

我会接收这样的字符串:

string selectedCountries = "Usa, Brazil, Chile";

如何将其(使用C#)转换回:

var myCountries = Countries.Usa | Countries.Brazil | Countries.Chile;

1
你能修复字符串初始化吗? - Maor Veitsman
不,我不能这样做。我只能接收格式化为默认标志枚举字符串的字符串。 - Paul_T
1
难道不应该是 string selectedCountries = "美国, 巴西, 智利"; 吗? - Maor Veitsman
你是正确的,Maor。我的错误,我会编辑问题。 - Paul_T
3个回答

9

请使用 Enum.Parse 方法。

例如:Countries c = (Countries)Enum.Parse(typeof(Countries), "Usa, Brazil...");


我同意应该使用Enum.Parse,但不认为你可以直接将整个字符串传递给Enum.Parse。 - dragonfly02
是的,你可以,我刚刚测试过了。 实际上,你正在将那个字符串转换为一个数字,然后将其强制转换为枚举类型。 谢谢 Tyranid。 - Paul_T
@Paul_T 你是说你可以直接将字符串“美国,巴西”传递到 Enum.Parse 中,它就可以工作? - dragonfly02
没错 stt106:如果你将字符串“Usa,Brazil,Chile”传递给Enum.parse,它会起作用。 在这个调用之后 Countries c = (Countries)Enum.Parse(typeof(Countries), "Usa, Brazil..."); c 存储 Countries.Usa | Countries.Brazil | Countries.Chile。 - Paul_T
如果您想避免可能的异常,请使用Enum.TryParse<Countries>("Usa, Brazil", out Countries c)。 - Pavel Popov

3

假设您的国家字符串由逗号分隔,这个方法对我有效:

private static Countries ConvertToCountryEnum(string country)
        {
            return country.Split(',').Aggregate(Countries.None, (seed, c) => (Countries)Enum.Parse(typeof(Countries), c, true) | seed);
        }

0
其实我意识到这比我想象的要简单。 我所需要做的就是将该字符串转换为int(在我的情况下),或者通常情况下转换为long,并将其强制转换为Countries。 它将把那个数字转换为预期的格式。 换句话说:
(Countries) 25 = Countries.Usa | Countries.Brazil | Countries.Chile;

1
这似乎不是有效的C#代码。 - Patrick Hofman
好的Patrick,我的意思是将int与枚举进行强制转换等于位的“或”。美国+巴西+智利=1+8+16=25,但不是C#代码。 - Paul_T

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