Pregunta

Dado un método DoSomething que toma una función (sin parámetros) y la maneja de alguna manera. ¿Hay alguna forma mejor de crear las " sobrecargas " para funciones con parámetros que el fragmento siguiente?

public static TResult DoSomething<TResult>(Func<TResult> func)
{
    //call func() and do something else
}

public static TResult DoSomething<T0, TResult>(
    Func<T0, TResult> func,
    T0 arg0)
{
    return DoSomething(() => func(arg0));
}

public static TResult DoSomething<T0, T1, TResult>(
    Func<T0, T1, TResult> func,
    T0 arg0, T1 arg1)
{
    return DoSomething(arg => func(arg, arg1), arg0);
}

public static TResult DoSomething<T0, T1, T2, TResult>(
    Func<T0, T1, T2, TResult> func,
    T0 arg0, T1 arg1, T2 arg2)
{
    return DoSomething(arg => func(arg, arg1, arg2), arg0);
}
¿Fue útil?

Solución

EDITAR: Como se señaló en los comentarios, esta es una aplicación parcial en lugar de curry. Escribí un blog sobre mi comprensión de la diferencia , que la gente puede encontrar interesante.

Bueno, no es particularmente diferente, pero separaría la parte actual de " llamar a DoSomething " parte:

public static Func<TResult> Apply<TResult, TArg> (Func<TArg, TResult> func, TArg arg)
{
    return () => func(arg);
}

public static Func<TResult> Apply<TResult, TArg1, TArg2> (Func<TArg1, TArg2, TResult> func,
                                                          TArg1 arg1, TArg2 arg2)
{
    return () => func(arg1, arg2);
}

// etc

Entonces:

DoSomething(Apply(foo, 1));

De esa manera, puede reutilizar el código actual en otras situaciones, incluidos los casos en los que no desea llamar al delegado que acaba de regresar de inmediato. (Es posible que desee curry más adelante, por ejemplo.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top