c# - 更改方法,从仅将字符串转换为字符串和 int

标签 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.

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

这实际上是一个两部分:

  1. 如何修改该方法,使 enumValue 成为 来自 enum [Flags]int 值(即,如果选择“1 + 2” (两个复选框),那么保存的 int 值将为“3”)?
  2. 最重要的是,我可以在方法中插入什么样的逻辑 这样我的所有其他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 分配值——很明显,因为它没有名称。我能想到两种解决方案:

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

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

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

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

Selected = enumValue.Equals(selectedValue)

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

直接回答您的问题:

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

关于c# - 更改方法,从仅将字符串转换为字符串和 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14139758/

相关文章:

c# - 如何将枚举序列化为 XML 文本

java - 我可以使用接口(interface)作为枚举中的变量吗?

c# - 使用 zedGraph 在 C# 中绘制图形

c# - 如何计算具有实用程序类的方法耗时

c# - Yield 关键字的具体用法是什么

asp.net-mvc - 在 MVC 上的 Application_BeginRequest 中重定向

c# - 如何在 MVC5 中为 Bundle 启用缓存

具有继承性的 C# 访问修饰符

c# - 使用 Controller 或 View 外部的元数据验证对象

c# - 我可以将枚举添加到现有的 .NET 结构中,例如日期吗?