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



我使用的是一个旧的(>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);

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

约翰的账户有期权A

约翰的账户有选项B

约翰的账户有选项C

最新更新