2

请耐心等待,因为这对我来说是一个困难的概念。我有一个方法enum以字符串形式返回项目(用于数据库存储)。这是方法:

public static IEnumerable<SelectListItem> GetItemsFromEnum<T>
    (T selectedValue = default(T)) where T : struct
{
    return from name in Enum.GetNames(typeof(T))
       let enumValue = Convert.ToString((T)Enum.
           Parse(typeof(T), name, true))

           select new SelectListItem
           {
               Text = GetEnumDescription(name, typeof(T)),
               Value = enumValue,
               Selected = enumValue.Equals(selectedValue)
           };
}

(注意:GetEnumDescription是类中的另一种方法,它使[Display(Name="")文本在 UI 中显示友好的内容。)

对于单个选择输入(单选按钮,下拉菜单),这很好用。但是,对于多选(列表框、复选框列表),我正在考虑使用该enum [Flags]属性作为int.

但是,该GetItemsFromEnum方法在我使用的情况下不起作用,[Flags]并且需要我更改它,以便在GetItemsFromEnum方法中分配的值不是 的字符串值enum,而是int值。

这实际上是一个两部分:

  1. 如何修改该方法,使其enumValue成为intfrom的值enum [Flags](即,如果选择“1 + 2”(两个复选框),则int保存的值将是“3”)?
  2. 最重要的是,我可以在方法中插入什么样的逻辑,以便我所有其他enum的(没有的[Flags])不受影响(即,它仍然转换ToString)?我在想一些if ... else逻辑,但这行得通吗?
4

1 回答 1

2

首先,该[Flags]属性不会为枚举的值添加特殊属性,它只是在将其Enum格式化为字符串时由类通过反射使用,并让使用您的代码的人知道他们可以安全地对枚举使用按位操作,或者换句话说,没有不希望的结果。

让我们来看看这个枚举:

[Flags]
enum MyEnum
{
    Undefined,
    Employee,
    Student
}

让我们以这种方式创建一个变量:

var employeeAndStudent = MyEnum.Employee | MyEnum.Student;

该变量如果转换为整数,则等于 3。虽然该ToString()方法将打印“Employee, Student”,Enum.GetNames但没有为字段 3 分配值——很明显,因为它没有name。我可以想到两个解决方案:

  1. 您创建自己的GetNames,除了定义的名称外,还返回枚举值的所有可能组合,方便地以您的格式打印。

  2. 您在枚举中定义标志,如果有很多成员,这可能会变得非常浪费。在我们的例子中,MyEnum将变为:

    [Flags]
    enum MyEnum
    {
        Undefined,
        Employee,
        Student,
        EmployeeAndStudent
    }
    

还有一件事,你的方法似乎有一个错误。这一行:

Selected = enumValue.Equals(selectedValue)

试图将枚举类型与字符串进行比较,并且总是会导致错误。你确定那SelectListItem.Value应该是 typestring吗?我建议你检查你的代码。

要直接回答您的问题:

  1. 添加[Flags]到您的枚举并使用 OR 运算符组合值。
  2. 在您的GetEnumDescription方法中,检查类型是否具有该Flags属性。
于 2013-01-03T13:56:29.573 回答