C#标志解析

时间:2012-11-07 11:15:23

标签: c# parsing flags

我写过枚举:

[Flags]
public enum BundleOS {
    Win32 = 0,
    Win64 = 1,
    Mac = 2
}

我需要从字符串解析它,并写入字符串。字符串示例:"Win32|Win64"。 下一个代码返回无效结果:

BundleOS os;
Boolean result = TryParse<BundleOS>("Win32|Win64", out os);

result变量中,我得到false值。但我需要trueos值必须具有BundleOS.Win32|BundleOS.Win64值。


如果我这样做:

String x = (BundleOS.Win32|BundleOS.Win64).ToString();

我需要获得这样的价值:"Win32|Win64",但我得到"Win64"

存在这些问题的简单解决方案吗?

4 个答案:

答案 0 :(得分:13)

您的问题是您执行按位操作并且Win32等于0 因此Win64 OR Win32实际上是Win64 OR 0,返回Win64

你可以这样设置你的枚举:

[Flags]
public enum BundleOS 
{
     Win32 = 1,
     Win64 = 2,
     Mac = 4
}

旁注: 我还要指出本周早些时候在how to define flag enums上提出的一个非常好的问题。

答案 1 :(得分:2)

除了@Blachshma给出的关于你的特定标志的答案之外,如果你想采用"Win32|Win64"的字符串形式并将其转换为枚举的实际实例,你还需要做更多的工作切出来。

首先,您只需要通过'“|”'split()字符串来获取各个值。

然后,您可以使用Enum.GetNames()Enum.GetValues()获取原始枚举中元素的名称和值列表。然后,您可以遍历拆分组件,并从原始枚举中找到匹配的条目(及其值)。

答案 2 :(得分:2)

尝试这样解析你的标志字符串。我没有测试,但它应该让你开始:

BundleOS flags = "Win32|Win64"
                    .Split('|')
                    .Select(s => (BundleOS)Enum.Parse(typeof(BundleOs), s))
                   .Aggregate((f, i) => f|i);

答案 3 :(得分:0)

除了Blachshma的答案之外,MSDN documentation for the FlagsAttribute实际上在“FlagsAttribute和Enum的指南”部分中非常简洁地解释了:

  

定义2的幂的枚举常数,即1,2,4,8,   等等。这意味着组合枚举中的各个标志   常数不重叠。

     

使用None作为其值为的标志枚举常量的名称   零。您不能在按位AND中使用None枚举常量   测试标志的操作,因为结果始终为零。   但是,您可以执行逻辑而非按位比较   要确定的数值和None枚举常量   是否设置了数值中的任何位。