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

What is the best way to enumerate bitmask Flags contained within a value?

我正在使用一个旧的(>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() 提取名称列表。

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

[Flags]
public enum PDMObjectFlags {
    None     = 0,    // 000000
    A = 1,    // 000001
    B = 2,    // 000010
    C = 4,    // 000100
    D = 8,    // 001000
    E = 16,   // 010000
    F = 32    // 100000
}

您可以使用以下方法扩展您的代码:

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);

这将打印您指定的输出,即:

John's account has Option A

John's account has Option B

John's account has Option C