我正在接手一个C#项目,我遇到了一个我不熟悉的概念。
该项目正在使用EF从枚举中创建查找表。 UI正在接受多选输入,但接收模型接受枚举类型,而不是列表/数组或其他暗示复数的东西。
枚举似乎有一些递归关系
public enum Options
{
None = 0,
[Display(Name = @"On-site Security")]
OnSiteSecurity = 1 << 0,
[Display(Name = @"Gated Entry")]
GatedEntry = OnSiteSecurity << 1,
[Display(Name = @"Gated Entry - Video")]
GatedEntryVideo = GatedEntry << 1,
[Display(Name = @"Closed-Circuit TV")]
CCTV = GatedEntryVideo << 1, ...
查找表有一个Value列,其值以指数方式增长, 0,1,2,4,8,16,32,64,128,256,512
最后,UI具有多选输入,其中值与查找表的编号顺序相同。有一个卫生功能作用于这样的值(knockout.js)
self.Value = ko.computed({
read: function () {
var value = 0;
$.each(self.Selected(), function (idxitem, item) {
value |= item;
});
return value;
},
write: function (value) {
$.each(self.Available(), function (idxitem, item) {
if ((value & item.Value) > 0) {
item.IsSelected(true);
}
});
self.Normalize(value);
},
owner: self
});
我不明白这应该如何接受多个选择。
答案 0 :(得分:1)
这听起来像是在实施flags。这允许您具有可以表示多个不同值的单个枚举值
这是一个简短的例子
class Program
{
static void Main(string[] args)
{
FlaggedEnum fruitbowl = FlaggedEnum.Apples | FlaggedEnum.Oranges | FlaggedEnum.Pears;
Console.WriteLine(fruitbowl);
Console.ReadLine();
}
}
[Flags]
enum FlaggedEnum
{
None = 0,
Apples = 1,
Pears = 2,
Oranges = 4,
Pineapples = 8
}
当你运行它时,你得到输出“苹果,橘子,梨”。它的整数值是7(4 + 2 + 1)。
2的幂的原因是由于它们的二进制等价,1 = 1,2 = 10 4 = 100,8 = 1000 ......所以这给出了7的值111.
我希望这至少让你走上正确的道路。