Tengo el siguiente código heredado:

if (isOnMainWindow
    || (win.GetType() != typeof(winInputBox)
    && win.GetType() != typeof(winMessage)
    && win.GetType() != typeof(winMsgBox)
    && win.GetType() != typeof(winAbout))
    ApplicationCommands.Close.Execute(null, win);

Esto se ve horrible. ¿Hay alguna manera de comparar varios tipos de objetos como en mi caso?

2
Otto Vasken 10 may. 2019 a las 19:06

3 respuestas

La mejor respuesta

No hay nada que pueda hacer exactamente lo que quieres, pero ¿por qué no usar una sintaxis más simple?

if (!(win is winInputBox) && !(win is winMessage) && !(win is winMsgBox) && !(win is winAbout)) ApplicationCommands.Close.Execute(null, win);

Alternativamente, puede usar un método para facilitarle la vida:

public static IsNotOneOf(object obj, params Type[] types)
{
    foreach (var type in types)
    {
        if (type.IsAssignableFrom(obj.GetType()) return false;
    }

    return true;
}

Y puedes usarlo así:

if (IsNotOneOf(win, typeof(winInputBox), typeof(winMessage), typeof(winMsgBox), typeof(winAbout)) ApplicationCommands.Close.Execute(null, win);
2
Ricardo Peres 10 may. 2019 a las 16:09

Alternativamente, si puede modificar las clases, cree una interfaz ficticia como:

public interface IShouldNotClose
{
}

Defina la interfaz como parte de cada una de estas ventanas y luego su cheque se convierte en

if (isOnMainWindow
    || !(win is IShouldNotClose))
    ApplicationCommands.Close.Execute(null, win);
3
Steve Todd 10 may. 2019 a las 16:18

Puede simplificarlo usando una Lista o HashSet

var typesToIgnore = new List<Type> { 
    typeof(winInputBox), 
    typeof(winMessage), 
    typeof(winMsgBox), 
    typeof(winAbout) 
};

if (isOnMainWindow || !typesToIgnore.Contains(win.GetType()))
{
}
1
johnny 5 10 may. 2019 a las 16:20
56081218