C# 枚举值中包含的位掩码标志的最佳方法是什么?
我正在使用一个旧的(>15年)系统,该系统使用char[]数组存储属性,如果索引有一个“X”,则该属性被激活。我做了这么多来转换它: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,
...
[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);