Enum.GetValues() 不返回您 (I) 所期望的内容



我定义了以下枚举器:

[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。

最新更新