C#标志解析
我写过enum:C#标志解析,c#,parsing,flags,C#,Parsing,Flags,我写过enum: [Flags] public enum BundleOS { Win32 = 0, Win64 = 1, Mac = 2 } 我需要从字符串解析它,然后写入字符串。字符串示例:“Win32 | Win64”。 下一个代码返回无效结果: BundleOS os; Boolean result = TryParse<BundleOS>("Win32|Win64", out os); 我需要得到这样的值:“Win32 | Win64”,但我得到
[Flags]
public enum BundleOS {
Win32 = 0,
Win64 = 1,
Mac = 2
}
我需要从字符串解析它,然后写入字符串。字符串示例:“Win32 | Win64”
。
下一个代码返回无效结果:
BundleOS os;
Boolean result = TryParse<BundleOS>("Win32|Win64", out os);
我需要得到这样的值:“Win32 | Win64”
,但我得到的是“Win64”
这些问题有一个简单的解决方案吗?您的问题是执行位运算,Win32等于0。
所以
Win64或Win32
实际上是Win64或0
,返回Win64
您可以按如下方式设置枚举:
[Flags]
public enum BundleOS
{
Win32 = 1,
Win64 = 2,
Mac = 4
}
旁注:
我还将指出本周早些时候提出的一个非常好的问题。除了@Blachshma给出的关于您的特定标志的答案外,如果您想采用字符串形式“Win32 | Win64”并将其转换为枚举的实际实例,您还需要做更多的工作 首先,只需将字符串按“|”进行
split()
然后,您可以使用
Enum.GetNames()
和Enum.GetValues()
获取原始枚举中元素的名称和值列表。然后,您可以在拆分组件中循环,并从原始枚举中找到匹配的条目(及其值)。尝试此操作以解析您的标志字符串。我还没有测试,但应该可以让你开始:
BundleOS flags = "Win32|Win64"
.Split('|')
.Select(s => (BundleOS)Enum.Parse(typeof(BundleOs), s))
.Aggregate((f, i) => f|i);
除了Blachshma的回答外,在“FlagsAttribute和Enum指南”一节中,实际上非常简洁地解释了: 以2的幂定义枚举常数,即1,2,4,8, 等等这意味着组合枚举中的各个标志 常数不重叠 使用None作为值为的标志枚举常量的名称 零。不能在按位AND中使用None枚举常量 操作测试标志,因为结果始终为零。 但是,您可以在以下对象之间执行逻辑比较,而不是按位比较 要确定的数值和非枚举常量 是否设置数值中的任何位
非常感谢。我没注意。:)不,存在一个更简单的解决方案:
String x=(BundleOS.Win32 | BundleOS.Win64).ToString().Replace(“,”,“|”)代码>这应该是答案!但请固定到:“Win32 | Win64”。拆分(“|”)。选择(s=>(BundleOs)枚举。解析(typeof(BundleOs),s))。聚合((f,i)=>f | i)代码>
BundleOS flags = "Win32|Win64"
.Split('|')
.Select(s => (BundleOS)Enum.Parse(typeof(BundleOs), s))
.Aggregate((f, i) => f|i);