请耐心等待,因为这对我来说是一个困难的概念。我有一个方法将 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
.
但是,在我使用 [Flags]
的情况下,GetItemsFromEnum
方法将不起作用,并要求我更改它,以便在 中分配的值GetItemsFromEnum
方法不是 enum
的字符串值,而是 int
值。
这实际上是一个两部分:
- 如何修改该方法,使
enumValue
成为 来自enum
[Flags]
的int
值(即,如果选择“1 + 2” (两个复选框),那么保存的int
值将为“3”)? - 最重要的是,我可以在方法中插入什么样的逻辑
这样我的所有其他
enum
(那些没有[Flags]
)都不是 受影响(即它仍然转换ToString
)?我正在考虑一些if ... else
逻辑,但这行得通吗?
最佳答案
首先,[Flags]
attribute 不会向枚举值添加特殊属性,它只是由 Enum
通过反射使用class 将其格式化为字符串,并让使用您的代码的人知道他们可以安全地对枚举使用按位运算,或者换句话说,不会出现不良结果。
让我们看一下这个枚举:
[Flags]
enum MyEnum
{
Undefined,
Employee,
Student
}
让我们这样创建一个变量:
var employeeAndStudent = MyEnum.Employee | MyEnum.Student;
该变量如果转换为整数,则等于 3。而 ToString()
方法将打印“员工,学生”,Enum.GetNames
没有为字段 3 分配值——很明显,因为它没有名称。我能想到两种解决方案:
您创建自己的
GetNames
除了定义的名称之外,它还会返回枚举值的所有可能组合,并以您的格式方便地打印。您在枚举中定义标志,如果有很多成员,这可能会变得非常浪费。在我们的例子中,
MyEnum
会变成:[Flags] enum MyEnum { Undefined, Employee, Student, EmployeeAndStudent }
还有一件事,你的方法似乎有一个错误。这一行:
Selected = enumValue.Equals(selectedValue)
正在尝试将枚举类型与字符串进行比较,并且始终会导致 false。您确定SelectListItem.Value
类型应为 string
?我建议您检查您的代码。
直接回答您的问题:
- 添加
[Flags]
添加到您的枚举并使用 OR 运算符来组合值。 - 在您的
GetEnumDescription
中方法,检查类型是否有Flags
属性。
关于c# - 更改方法,从仅将字符串转换为字符串和 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14139758/