我写过枚举:
[Flags]
public enum BundleOS {
Win32 = 0,
Win64 = 1,
Mac = 2
}
我需要从字符串解析它,并写入字符串。字符串示例:"Win32|Win64"
。
下一个代码返回无效结果:
BundleOS os;
Boolean result = TryParse<BundleOS>("Win32|Win64", out os);
在result
变量中,我得到false
值。但我需要true
,os
值必须具有BundleOS.Win32|BundleOS.Win64
值。
如果我这样做:
String x = (BundleOS.Win32|BundleOS.Win64).ToString();
我需要获得这样的价值:"Win32|Win64"
,但我得到"Win64"
。
存在这些问题的简单解决方案吗?
答案 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枚举常量 是否设置了数值中的任何位。