迭代按位枚举的已保存值

时间:2010-09-28 15:20:10

标签: .net enumeration

我使用Bitwise Enum作为转发器控件的数据源,其中每行都有一个复选框。当用户保存数据时,与复选框对应的枚举值将保存到单个数据库字段中。

但是,当用户来编辑数据时,显然我需要使用现有值预先填充转发器。我可以通过相应地枚举枚举和复选框的可能值来以简单的方式执行此操作。但是,理想情况下,我真的希望我的代码保持独立于数据的更改:因此,如果我更改或添加Enum中的值,我的代码仍然可以在不更改控件中的代码的情况下工作。

似乎显而易见的是,一旦我从数据库中取回它,就尝试遍历枚举字段中的现有值。换句话说,如果保存的值对应于枚举中的几个中的两个选择,我需要遍历这两个选项。但是,我没有看到任何可用于执行此操作的方法或属性。有人能指出我正确的方向吗?

一个可能有助于理解这个问题的示例......我可以通过将其转换为字符串并将其拆分来获得我想要的效果,但它很笨拙(comsPrefs是有问题的枚举)

        Dim selectedPrefs As String = comsPrefs.ToString()
        Dim splitStr() As String = selectedPrefs.Split(","c)
        Dim i As Integer

        For i = 0 To splitStr.Length - 1
            'do some cool stuff
        Next

2 个答案:

答案 0 :(得分:2)

这样的东西?

[Flags]
public enum YourEnum
{
    One = 1, Two = 2, Four = 4, Eight = 8
}

// ...

YourEnum exampleData = YourEnum.Two | YourEnum.Four;

var values = Enum.GetValues(typeof(YourEnum))
                 .Cast<YourEnum>()
                 .Where(x => exampleData.HasFlag(x));

foreach (var v in values)
{
    Console.WriteLine(v);
}

请注意,HasFlag方法仅适用于.NET 4 - 如果您使用的是早期版本的框架,则需要使用Where(x => (exampleData & x) == x)

答案 1 :(得分:0)

要获取枚举的所有值,请使用Enum.GetValues(typeof(myEnumeration))

System.Enum有其他方法可以让你获取标识符(名称)并将命名转换为/从值。

NB。除非每个不同的值具有不同的唯一位模式(即,没有两个不同的子集,当与按位组合或具有相同的值时),某些转换将是不明确的。