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

时间:2015-03-27 20:46:04

标签: c# asp.net-mvc razor enums bitmask

我正在使用使用char []数组存储属性的旧(> 15年)系统,如果索引具有" 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视图中并在页面上进行迭代。

谢谢!

1 个答案:

答案 0 :(得分:2)

将此作为整数后,您可以转换回枚举并使用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的帐户有选项A

     

John的帐户有选项B

     

John的帐户有选项C