2

我写了枚举:

[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

4 回答 4

13

您的问题是您执行按位运算并且 Win32 等于
0。Win64 OR Win32实际上Win64 OR 0返回Win64.

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

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

附带说明:我还将指出本周早些时候提出的一个非常好的问题,该问题是关于如何定义标志枚举

于 2012-11-07T11:17:55.667 回答
2

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

首先,您只需要split()通过 '"|"' 获取字符串即可获取各个值。

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

于 2012-11-07T11:23:36.677 回答
2

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

BundleOS flags = "Win32|Win64"
                    .Split('|')
                    .Select(s => (BundleOS)Enum.Parse(typeof(BundleOs), s))
                   .Aggregate((f, i) => f|i);
于 2012-11-07T11:25:03.433 回答
0

除了 Blachshma 的回答之外,MSDN 文档FlagsAttribute实际上在“FlagsAttribute 和枚举指南”部分中非常简洁地解释了:

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

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

于 2012-11-07T11:34:09.950 回答