Как заставить перечисление [Flags] и case переключаться вместе?

Как заставить перечисление [Flags] и case переключаться вместе? Очень желательно, чтобы все выглядело просто. Подобные вопросы задавались много раз, но никогда напрямую не перечислялись [Flags].

Если M1 установлен, выполнить операцию 1,

если М2 установить выполнить операцию2,

если ОБА 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#?

2 ответа

Решение

Это будет выполняться для любого установленного бита

например

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

Вы не можете сделать это с switch в C#, поскольку после выполнения дела, никакое другое дело не будет выполнено.
Вы можете думать о 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
}
Другие вопросы по тегам