我定义了以下枚举器:
[Flags]
public enum CoinSizes
{
[Display(Name = "0.01")]
OneCent = 0x1,
[Display(Name = "0.02")]
TwoCent = 0x2,
[Display(Name = "0.05")]
FiveCent = 0x4,
[Display(Name = "0.10")]
TenCent = 0x8,
[Display(Name = "0.20")]
TwentyCent = 0x16,
[Display(Name = "0.25")]
TwentyFiveCent = 0x32,
[Display(Name = "0.50")]
FiftyCent = 0x64,
[Display(Name = "1.00")]
OneDollar = 0x128,
[Display(Name = "2.00")]
TowDollar = 0x256,
[Display(Name = "5.00")]
FiveDollar = 0x512,
[Display(Name = "10.00")]
TenDollar = 0x1024,
[Display(Name = "25.00")]
TwentyFiveDollar = 0x2048,
[Display(Name = "50.00")]
FiftyDollar = 0x4096
}
我正在构建一个 MVC Web 应用程序,并且我定义了一个自定义的 EnumCheckboxListFor 帮助程序。在帮助程序中,我使用 Linq 迭代枚举项,并检查哪些项被选中,从而需要选中哪些复选框。
我正在使用以下内容来获取可用枚举的完整列表,然后对其进行迭代:
Enum.GetValues((typeof(TEnum)))
林克:
TEnum enumValues = expression.Compile()((TModel)htmlHelper.ViewContext.ViewData.Model);
IEnumerable<SelectListItem> items = Enum
.GetValues(enumType)
.Cast<Enum>()
.Select(c => new SelectListItem
{
Text = c.EnumDisplayName().ToString(),
Value = c.ToString(),
Selected = enumValues != null && (value.Equals(c) || value.ToString().Contains(c.ToString()))
}).ToList();
我知道确定"已选择"的逻辑并不完美,但这是一个 WIP。主要是,Enum.GetValues() 返回的数组是奇数:
Enum.GetValues((typeof(TEnum)))
{Href.DataStore.Gambling.Core.CoinSizes[13]}
[0]: OneCent
[1]: TwoCent
[2]: FiveCent
[3]: TenCent
[4]: 22
[5]: 50
[6]: 100
[7]: 296
[8]: 598
[9]: 1298
[10]: 4132
[11]: 8264
[12]: 16534
前四个是正确的,但显然这些 int 值(从索引 4 开始)与枚举的值不对应。
知道为什么我会得到这些奇怪的值吗?
0X16是一个十六进制值,等于 1*16 + 6 = 22。
同样地
0x32 = 3*16 + 2 = 50
0x64 = 6*16 + 4 = 100 等等。
尝试将十六进制值更改为十进制值,即
[Flags]
public enum CoinSizes
{
[Display(Name = "0.01")]
OneCent = 1,
[Display(Name = "0.02")]
TwoCent = 2,
[Display(Name = "0.05")]
FiveCent = 4,
[Display(Name = "0.10")]
TenCent = 8,
[Display(Name = "0.20")]
TwentyCent = 16,
[Display(Name = "0.25")]
TwentyFiveCent = 32,
[Display(Name = "0.50")]
FiftyCent = 64,
[Display(Name = "1.00")]
OneDollar = 128,
[Display(Name = "2.00")]
TowDollar = 256,
[Display(Name = "5.00")]
FiveDollar = 512,
[Display(Name = "10.00")]
TenDollar = 1024,
[Display(Name = "25.00")]
TwentyFiveDollar = 2048,
[Display(Name = "50.00")]
FiftyDollar = 4096
}
使用具有冲突值的标志枚举是不明智的。如果使用,Oring 或 AND 它们会产生不希望的结果。
返回的值是正确的,您使用十六进制代码。所以0x16是22岁。因为1*16+6是22。同样对于其他值,如 0x64 是 100。