如何使 [Flags] enum 和 switch case 一起工作?

How to make [Flags] enum and switch case work together?

如何让 [Flags] enum 和 switch case 协同工作?非常希望让它看起来简单。多次询问类似问题,但从未直接针对 [Flags] 枚举。

如果M1设置执行操作1,

如果M2设置执行操作2,

if BOTH M1 and M2 then set execute operation 1 and 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#?

你不能用 c# 中的 switch 做到这一点,因为一旦执行了一个案例,就不会执行其他案例。
您可以将 switch 语句视为编写 if... else if... else... 结构的更短方式 - 其中每个 case 是一个 if,而 default 是最终的 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
}

这将对任何位设置执行

例如

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
    }
}