请耐心等待,因为这对我来说是个难题。我有一个方法,它返回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
值。
这实际上是两个部分:
enumValue
成为
来自int
enum
的{{1}}的值(即,如果选择“1 + 2”)
(两个复选框),然后保存的[Flags]
值为“3”)?int
(没有enum
的人)都没有
受影响(即,它仍会转换[Flags]
)?我在考虑一些ToString
逻辑,但这会起作用吗?答案 0 :(得分:2)
首先,[Flags]
属性不会为枚举值添加特殊属性,它在格式化时仅由Enum
类通过反射使用它作为一个字符串,并让使用你的代码的人知道他们可以安全地对枚举使用按位运算,换句话说,没有不希望的结果。
让我们来看看这个词:
[Flags]
enum MyEnum
{
Undefined,
Employee,
Student
}
让我们以这种方式创建一个变量:
var employeeAndStudent = MyEnum.Employee | MyEnum.Student;
变量(如果转换为整数)等于3.而ToString()
方法将打印&#34;员工,学生&#34;,Enum.GetNames
没有值分配给字段3 - 很明显,因为它没有名称。我可以想到两个解决方案:
您创建了自己的GetNames
,除了定义的名称外,还会返回枚举值的所有可能组合,方便地以您的格式打印。
您可以在枚举中定义标记,如果有许多成员,则会变得非常浪费。在我们的例子中,MyEnum
将成为:
[Flags]
enum MyEnum
{
Undefined,
Employee,
Student,
EmployeeAndStudent
}
还有一件事,你的方法似乎有一个bug。这一行:
Selected = enumValue.Equals(selectedValue)
尝试将枚举类型与字符串进行比较,并始终导致false。您确定SelectListItem.Value
应该是string
类型吗?我建议你检查你的代码。
直接回答您的问题:
[Flags]
添加到枚举中,并使用OR运算符组合值。GetEnumDescription
方法中,检查类型是否具有Flags
属性。