【问题标题】:How is an int translated to which enums are selected?如何将 int 转换为选择的枚举?
【发布时间】:2017-02-01 19:14:23
【问题描述】:

以前的开发人员(他不再与我们合作,所以我不能问他)做了一些非常巧妙的事情,我真的不明白。我们有这个枚举:

   [Flags]
    public enum SidingTypePreference
    {
        [Value(Name = "Vinyl")]
        Vinyl = 1,
        [Value(Name = "Metal or Aluminum")]
        MetalOrAluminum = 2,
        [Value(Name = "Composite")]
        Composite = 4,
        [Value(Name = "Wood")]
        Wood = 8,
        [Value(Name = "Other")]
        Other = 16
    }

在数据库中,SidingTypes 存储为单个 int,它是所有选定值的总和。

在模型中:

public SidingTypePreference? SidingTypes { get; set; }

在控制器中,table 只是查询的一行结果:

Model.SidingTypes = table.SidingTypes

在视图中:

@Html.EditorFor(m => Model.SidingTypes, new { @class = "form-control input-sm", GroupID = "SidingTypePreference", Cols = 1 })

但是,这是我不明白的部分。假设SidingTypes = 10。通过某种巫术魔法,该 int 被翻译成:

<input type="checkbox" class="..." name="SidingTypes_0" value="1">  Vinyl
<input type="checkbox" class="..." name="SidingTypes_1" value="2" checked>  Metal or Aluminum
<input type="checkbox" class="..." name="SidingTypes_2" value="4"> Composite
<input type="checkbox" class="..." name="SidingTypes_3" value="8" checked> Wood
<input type="checkbox" class="..." name="SidingTypes_4" value="16"> Other

(编辑类只是为了防止需要滚动,但它们都是'lookup-checkbox-SidingTypes'。)

根据该 int 的值,它知道哪些已检查,哪些未检查。

第一个问题:这是本机 .NET 吗?或者我需要找到一些扩展方法或模板吗?

第二个问题:我需要做的,独立于其他任何事情,是构建一个方法来确定是否选择了枚举。

类似:

private bool IsSelected(int SidingTypes, SidingTypePreference sidingTypePreference)
{
  ... ?? ...
  return true or false;
}

【问题讨论】:

标签: c# .net asp.net-mvc enums


【解决方案1】:

这是本机 .NET 吗?

其中一部分是。具有 Flags 属性的枚举将一个值分解为构成该复合值的等效位(例如 10 = 2 + 8)

将该值转换为一组复选框不是原生的。我怀疑项目中有一个自定义模板可以将枚举值转换为一组复选框

如何确定是否选择了枚举。

只需使用按位运算:

private bool IsSelected(int SidingTypes, SidingTypePreference sidingTypePreference)
{
  return (SidingTypes & (int)sidingTypePreference) != 0;
}

由于&amp; 运算符将返回一个数字,其中包含SidingTypessidingTypePreference 中“选定”的位。如果没有标志匹配,结果将全为零;所以任何非 0 的数字都表示匹配。

【讨论】:

  • Enum 上有一个方法 HasFlag(Enum flag) 可以进行检查。
  • 好的,谢谢 D Stanley。但是,一个问题。在上面的示例中,我得到:运算符 '&' 不能应用于 Int 和 SidingTypePrefrences 类型的操作数
  • @CaseyCrookston 我错过了您正在检查 int 与 enum 的情况。我向 int 添加了一个强制转换以允许该操作。
  • @Fran 是的,但输入是 int 而不是 SidingTypePreference,因此您必须将 int 值转换为等效的枚举。此外,HasFlag 还存在一些类型安全开销。由于我们已经不是类型安全的,因此不需要开销。
  • 真的。我正在做一个 Enum.Parse() 将我的 int 放入标志值中。
【解决方案2】:

上次我检查(几年前),ASP.NET MVC 没有像这样的标志枚举的内置模板。但是,开发人员很可能创建了一个 custom editor template 来识别这种类型(或者通常标记枚举)并为其显示一个编辑器。

查看Views/Shared/EditorTemplates/ 中的文件——尤其是名为SidingTypePreference.cshtmlObject.cshtml 的文件。在项目中的任何位置对lookup-checkbox- 进行全文搜索也可能会有所帮助。

对于您的第二个问题,D Stanley 的回答是正确的:您对您感兴趣的值使用按位 &amp; 运算符,然后检查结果是否为非零。

【讨论】:

  • 谢谢!!您搜索查找复选框的提示是正确的。找到模板。
  • 另外,我要问一下你的用户名... StriplingWarrior。介意我问那是什么:-)?
  • @CaseyCrookston:摩尔门经中有一段记载,有一群年轻士兵表现出极大的信心,以至于他们在战斗中得到了神圣的保护。他们在圣经中被称为“脱衣士兵”,但在现代 LDS 文化中,他们通常被称为Stripling Warriors。 “Stripling”只是意味着“年轻”。我年轻时采用了用户名/电子邮件,并且随着年龄的增长而不再费心更新它。 :-)
  • 好吧,我就是这么想的 :-) 它引起了我的注意。去希拉曼的军队!
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 2013-06-02
  • 2013-08-03
相关资源
最近更新 更多