0

如何使 [Flags] 枚举和 switch case 一起工作?非常希望使它看起来简单。类似的问题问了很多次,但从来没有直接向 [Flags] 枚举。

如果 M1 设置执行操作 1,

如果 M2 设置执行 operation2 ,

如果 BOTH M1 和 M2 则设置执行操作 1 和 2。

 [Flags]
    public enum TST
    {
        M1 =1,
        M2 =2,
        M3 =4
    }

 public void PseudoCode()
    {

        TST t1 = TST.M1 | TST.M3; //1+2= 3

        switch( t1)
        {
            case TST.M1:
                {
                    //Do work if Bit 1 set
                }
            case TST.M2:
                {
                    //Do work if Bit 2 set
                }
            case TST.M3:
                {
                    //Do work if Bit 3 set
                }
            default:
                {
                    //nothing set;
                    break;
                }
        }

    }

我也很确定很多人想知道如何使它工作。请求修复 C#?

4

2 回答 2

3

这将对任何位集执行

例如

ExecuteOnFlagValue(TST.M1 | TST.M3); //1+2= 3

将执行位 1 和 3 的代码

public void ExecuteOnFlagValue(TST value) {
    if (value & TST.M1 == TST.M1) {
        //Do work if bit 1
    }
    if (value & TST.M2 == TST.M2) {
        //Do work if bit 2
    }
    if (value & TST.M3 == TST.M3) {
        //Do work if bit 3
    }
}
于 2018-09-12T08:58:03.783 回答
0

你不能switch在 c# 中做到这一点,因为一旦执行了一个案例,就不会执行其他案例。
您可以将switch语句视为编写构造的一种更短的方式if... else if... else...- 其中每个case是一个if,而 thedefault是最后一个else

这意味着以下switch语句:

switch( t1)
{
    case TST.M1:
        //Do work if Bit 1 set
        break;
    case TST.M2:
        //Do work if Bit 2 set
        break;
    case TST.M3:
        //Do work if Bit 3 set
        break;
    default:
        //nothing set;
        break;
}

等效于以下if...else if... else构造:

if(t1 == TST.M1)
{
    //Do work if only Bit 1 set
}
else if (t1 == TST.M2)
{
    //Do work if only Bit 2 set
}
else if (t1 == TST.M3)
{
    //Do work if only Bit 3 set
}
else
{
    //nothing set or multiple bits set
}
于 2018-09-12T08:55:33.180 回答