更改方法只是将字符串转换为字符串和int

时间:2013-01-03 13:20:35

标签: c# asp.net-mvc enums

请耐心等待,因为这对我来说是个难题。我有一个方法,它返回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成为 来自int enum的{​​{1}}的值(即,如果选择“1 + 2”) (两个复选框),然后保存的[Flags]值为“3”)?
  2. 最重要的是,我可以在方法中插入什么样的逻辑 所以我的所有其他int(没有enum的人)都没有 受影响(即,它仍会转换[Flags])?我在考虑一些ToString逻辑,但这会起作用吗?

1 个答案:

答案 0 :(得分:2)

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

让我们来看看这个词:

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

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

var employeeAndStudent = MyEnum.Employee | MyEnum.Student;

变量(如果转换为整数)等于3.而ToString()方法将打印&#34;员工,学生&#34;,Enum.GetNames没有值分配给字段3 - 很明显,因为它没有名称。我可以想到两个解决方案:

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

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

    [Flags]
    enum MyEnum
    {
        Undefined,
        Employee,
        Student,
        EmployeeAndStudent
    }
    
  3. 还有一件事,你的方法似乎有一个bug。这一行:

    Selected = enumValue.Equals(selectedValue)
    

    尝试将枚举类型与字符串进行比较,并始终导致false。您确定SelectListItem.Value应该是string类型吗?我建议你检查你的代码。

    直接回答您的问题:

    1. [Flags]添加到枚举中,并使用OR运算符组合值。
    2. GetEnumDescription方法中,检查类型是否具有Flags属性。