Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过“迭代”;“设置”;.NETC#3.5中的枚举_C#_.net_.net 3.5_Enums_Bit Manipulation - Fatal编程技术网

如何通过“迭代”;“设置”;.NETC#3.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

我知道在.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 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());
    }
}