gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:10:43 25 4
gpt4 key购买 nike

请耐心等待,因为这对我来说是一个困难的概念。我有一个方法将 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] 属性作为 存储在数据库中整数

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

这实际上是一个两部分:

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

最佳答案

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

让我们来看看这个枚举:

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

让我们这样创建一个变量:

var employeeAndStudent = MyEnum.Employee | MyEnum.Student;

变量,如果转换为整数,则等于 3。ToString() 方法将打印“Employee, Student”,Enum.GetNames 不会为字段 3 分配了一个值 -- 很明显,因为它没有名称。我可以想到两种解决方案:

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

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

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

还有一点,你的方法好像有bug。这一行:

Selected = enumValue.Equals(selectedValue)

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

直接回答您的问题:

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com