Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#标志解析_C#_Parsing_Flags - Fatal编程技术网

C#标志解析

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”,但我得到

我写过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”
,但我得到的是
“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);