C# 与 EF 枚举、lookup-table 和要传递的值?
C# with EF enum, lookup-table and the Value to pass it?
我在接手一个C#项目,遇到了一个我不熟悉的概念。
该项目正在使用 EF 从枚举中创建查找 table。 UI 接受多 select 输入,但接收模型接受枚举类型,而不是 list/array 或其他暗示复数的类型。
枚举好像有某种递归关系
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, ...
查找 table 有一个值列,其值呈指数增长,
0,1,2,4,8,16,32,64,128,256,512
最后 UI 有一个多 select 输入,其中的值与查找 table 的数字序列相同。有一个卫生功能作用于这样的值(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
});
我不明白这应该如何接受复数 selection。
听起来像是在实施 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
}
当您 运行 执行此操作时,您将获得输出 "Apples, Oranges, Pears"。它的整数值为 7 (4 + 2 + 1)。
2 的幂的原因是由于它们的二进制等价物,1 = 1、2 = 10 4 = 100、8 = 1000...因此 7 的值为 111。
我希望这至少能让你走上正确的道路。
我在接手一个C#项目,遇到了一个我不熟悉的概念。
该项目正在使用 EF 从枚举中创建查找 table。 UI 接受多 select 输入,但接收模型接受枚举类型,而不是 list/array 或其他暗示复数的类型。
枚举好像有某种递归关系
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, ...
查找 table 有一个值列,其值呈指数增长, 0,1,2,4,8,16,32,64,128,256,512
最后 UI 有一个多 select 输入,其中的值与查找 table 的数字序列相同。有一个卫生功能作用于这样的值(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
});
我不明白这应该如何接受复数 selection。
听起来像是在实施 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
}
当您 运行 执行此操作时,您将获得输出 "Apples, Oranges, Pears"。它的整数值为 7 (4 + 2 + 1)。
2 的幂的原因是由于它们的二进制等价物,1 = 1、2 = 10 4 = 100、8 = 1000...因此 7 的值为 111。
我希望这至少能让你走上正确的道路。