.net 迭代按位枚举的保存值

.net 迭代按位枚举的保存值,.net,enumeration,.net,Enumeration,我使用位枚举作为中继器控件的数据源,其中每行都有一个复选框。用户保存数据时,与复选框对应的枚举值将保存到单个数据库字段中 然而,当用户来编辑数据时,显然我需要用现有值预先填充中继器。我可以通过遍历枚举的可能值和相应的复选框,在一个简单的值中实现这一点。但是,理想情况下,我希望我的代码保持独立于对数据的更改:因此,如果我更改枚举中的值或添加到枚举中的值,我的代码仍然可以工作,而不会更改控件中的代码 显然,从数据库中获取枚举字段后,要尝试遍历该字段中的现有值。换句话说,如果保存的值对应于枚举中几个选

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

然而,当用户来编辑数据时,显然我需要用现有值预先填充中继器。我可以通过遍历枚举的可能值和相应的复选框,在一个简单的值中实现这一点。但是,理想情况下,我希望我的代码保持独立于对数据的更改:因此,如果我更改枚举中的值或添加到枚举中的值,我的代码仍然可以工作,而不会更改控件中的代码

显然,从数据库中获取枚举字段后,要尝试遍历该字段中的现有值。换句话说,如果保存的值对应于枚举中几个选项中的两个选项,则我需要循环这两个选项。然而,我看不到任何方法或属性可以用来实现这一点。谁能给我指出正确的方向吗

一个样本。。。这可能有助于理解这一点。。。我可以通过将其转换为字符串并拆分来获得我想要的效果,但这很笨拙(comsPrefs是所讨论的枚举)


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

具有其他方法,允许您获取标识符(名称)并将命名值转换为/从值

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

类似的情况

[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);
}
[标志]
公共枚举YourEnum
{
一=1,二=2,四=4,八=8
}
// ...
YourEnum exampleData=YourEnum.Two | YourEnum.Four;
var values=Enum.GetValues(typeof(YourEnum))
.Cast()
.其中(x=>exampleData.HasFlag(x));
foreach(值中的var v)
{
控制台写入线(v);
}

请注意,
HasFlag
方法仅在.NET4中可用——如果您使用的是早期版本的框架,那么您需要使用
Where(x=>(exampleData&x)==x)

也许一个代码示例可以说明您正在尝试做什么?谢谢,但我不需要所有可能的值。我只需要保存的值。假设我的枚举是:苹果=1,橙子=2,梨=4,为特定行保存的值是3(苹果或橙子)。。我需要反复查看已保存内容的潜在值,即苹果、橙子。有道理吗?很好,谢谢。我对linq/lambda还不够熟悉,还没有把它当作解决方案!
[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);
}