如何通过“迭代”;“设置”;.NETC#3.5中的枚举
我知道在.NET4中可以使用HasFlag 在.NET3.5中是否有以下内容的替代方案如何通过“迭代”;“设置”;.NETC#3.5中的枚举,c#,.net,.net-3.5,enums,bit-manipulation,C#,.net,.net 3.5,Enums,Bit Manipulation,我知道在.NET4中可以使用HasFlag 在.NET3.5中是否有以下内容的替代方案 if ((enumVar & EnumType.ValueOne) == EnumType.ValueOne) { // someMethod(1) or someMethod(EnumType.ValueOne) } if ((enumVar & EnumType.ValueTwo) == EnumType.ValueTwo) { // someMethod(2) or someMe
if ((enumVar & EnumType.ValueOne) == EnumType.ValueOne)
{
// someMethod(1) or someMethod(EnumType.ValueOne)
}
if ((enumVar & EnumType.ValueTwo) == EnumType.ValueTwo)
{
// someMethod(2) or someMethod(EnumType.ValueTwo)
}
if ((enumVar & EnumType.ValueThree) == EnumType.ValueThree)
{
// someMethod(3) or someMethod(EnumType.ValueThree)
}
if ((enumVar & EnumType.ValueFour) == EnumType.ValueFour)
{
// someMethod(4) or someMethod(EnumType.ValueFour)
}
…是否为枚举中的每个值设置等?您必须能够使用for..each循环来完成此任务,其中someMethod的参数是循环的索引
[Flags]
enum EnumType
{
ValueOne = 1
, ValueTwo = 2
, ValueThree = 4
, ValueFour = 8
}
编辑:只值得查看已接受的答案,其余的注释/答案可以安全地忽略。您可以执行类似操作来执行EnumType的foreach循环
foreach (EnumType enumType in Enum.GetValues(typeof(EnumType)))
{
if (enumType.HasFlag(enumType))
{
Console.WriteLine(enumType.ToString());
}
}
这将返回值一、值二、值三。。蚀刻
不确定这是否是您想要的,请测试并让我以及其他人知道您应该能够编写类似的内容。如果需要,可以将其设置为泛型,但无法将约束设置为enum,因此您必须使用反射检查该约束
public static bool HasFlag(YourEnum source, YourEnum flag)
{
return (source & flag) == flag;
}
为什么不使用switch/case语句呢?那么你承认它不能在循环中完成吗?你没有使用你正在使用的循环if's…@RhysW这就是重点。我给出了ifs并询问它们是否可以重写为循环抱歉,我假设你的回答是针对Chris的,没有看到循环要求,该要求不检查枚举值是否已设置?你可以在该循环中添加一个条件语句,我希望我正确理解你的问题。。如果您愿意,还可以添加一个Switch语句。您能给出示例代码吗?它不能使用HasFlag,因为这是.NET 3.5GregT。我误解了你的问题。我给出的答案将在FOR循环中返回枚举类型的值。我对此表示歉意,我想这就是为什么HasFlag是introduced@GregT如果“作弊”,则可以约束到枚举。查看项目无约束旋律链接的位置。我没有说过不要使用HasFlag-这是.NET3.5抱歉-没有读到。在这种情况下,您需要使用&运算符。@lazyberezovsky HasFlag是在.net 4中引入的。他使用的是早期版本。如果(enumVar&enumType){…}应产生与hasFlagyes相同的结果,但HasFlag可以参数化,但其他符号不能,因此不能在循环中完成
switch enumvar
{
case valueOne:
{
//do some thing
breake;
}
case valuetwo:
{
//do some thing else
break;
}
default:
break;
}
foreach (EnumType enumType in Enum.GetValues(typeof(EnumType)))
{
if(enumVar.HasFlag(enumType))
{
Console.WriteLine(enumTpye.ToString());
}
}