Как заставить перечисление [Flags] и case переключаться вместе? - PullRequest
0 голосов
/ 12 сентября 2018

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

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

если M2 настроен на выполнение операции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 ]

0 голосов
/ 12 сентября 2018

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

, например,

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
    }
}
0 голосов
/ 12 сентября 2018

Вы не можете сделать это с помощью 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
}
...