¿Banderas bit a bit y declaración de cambio?

Tengo el siguiente código (ejemplo), y realmente no me siento cómodo con tantas comprobaciones 'si':

public enum Flags 
{
    p1 = 0x01,  // 0001
    p2 = 0x02,  // 0010  
    p3 = 0x04,  // 0100
    p4 = 0x08   // 1000
};      

public static void MyMethod (Flags flag)
{
    if ((flag & Flags.p1) == Flags.p1)
        DoSomething();

    if ((flag & Flags.p2) == Flags.p2)
        DosomethingElse();

    if ((flag & Flags.p3) == Flags.p3)
        DosomethingElseAgain();

    if ((flag & Flags.p4) == Flags.p4)
        DosomethingElseAgainAndAgain();
}

MyMethod(Flags.p1 | Flags.p3);

¿Hay alguna manera de que pueda usar una declaración de 'cambio'? ¿Tal vez si los convierto en cadenas o uso matrices?

Respuestas a la pregunta(2)

Su respuesta a la pregunta