Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.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#_Asp.net Mvc_Razor_Enums_Bitmask - Fatal编程技术网

C# 枚举值中包含的位掩码标志的最佳方法是什么?

C# 枚举值中包含的位掩码标志的最佳方法是什么?,c#,asp.net-mvc,razor,enums,bitmask,C#,Asp.net Mvc,Razor,Enums,Bitmask,我正在使用一个旧的(>15年)系统,该系统使用char[]数组存储属性,如果索引有一个“X”,则该属性被激活。我做了这么多来转换它: ... [Flags] public enum PDMObjectFlags { None = 0, // 000000 OptionA = 1, // 000001 OptionB = 2, // 000010 OptionC = 4, // 000100 OptionD = 8,

我正在使用一个旧的(>15年)系统,该系统使用char[]数组存储属性,如果索引有一个“X”,则该属性被激活。我做了这么多来转换它:

...

[Flags]
public enum PDMObjectFlags {
    None    = 0,     // 000000
    OptionA = 1,     // 000001
    OptionB = 2,     // 000010
    OptionC = 4,     // 000100
    OptionD = 8,     // 001000
    OptionE = 16,    // 010000
    OptionF = 32     // 100000
}

...

string userOptionsStr = "   XXX";           // "   XXX"
string userOptionsBin = userOptions
                       .Replace('X', '1')
                       .Replace(' ', '0');  // "000111"
int userOptionsInt = 
    Convert.ToInt32(userOptionsBin, 2);     // 7
我怎样才能得到一个能让我显示某个特定用户所有属性的东西呢?大概是这样的:

foreach (var x in userOptionsList){
    Console.Write("John's account has " + x);
}

// Output:
// 
// John's account has OptionA
// John's account has OptionB
// John's account has OptionC
对不起,如果这个例子是愚蠢的,我只是在这里输入。它最终将与模型一起传递到Razor视图中,并在页面上进行迭代


谢谢

一旦将其作为整数,就可以转换回枚举并使用
ToString()
提取名称列表

给定的枚举定义为(编译):

您可以通过以下方式扩展代码:

PDMObjectFlags flags = (PDMObjectFlags)userOptionsInt;  
var names = flags.ToString().Split(new[] {',',' '}, StringSplitOptions.RemoveEmptyEntries);

foreach(var name in names)
    Console.WriteLine("John\'s account has Option {0}", name);
这将打印您指定的输出,即:

约翰的帐户有选择权

约翰的帐户有B选项

约翰的账户有C选项


完美的非常感谢。我知道我已经非常接近了如果我有代表,我会+的。我会尽快接受。@ReedCopsey声明“返回值是一个字符串,包含以分隔符分隔的常量名称列表”。使用
,是否安全?@AlexD使用的分隔符是逗号,但@ReedCopsey无论区域设置或其他情况,是否正确?@AlexD是的,我相信它总是使用逗号-但如果需要,我会验证。
PDMObjectFlags flags = (PDMObjectFlags)userOptionsInt;  
var names = flags.ToString().Split(new[] {',',' '}, StringSplitOptions.RemoveEmptyEntries);

foreach(var name in names)
    Console.WriteLine("John\'s account has Option {0}", name);