Question

Étant donné une méthode DoSomething qui prend une fonction (sans paramètre) et la gère d'une manière ou d'une autre. Existe-t-il un meilleur moyen de créer les " surcharges " pour les fonctions avec des paramètres que l'extrait ci-dessous?

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);
}
Était-ce utile?

La solution

EDIT: Comme indiqué dans les commentaires, il s’agit d’une application partielle plutôt que curry. J'ai écrit un article sur ma compréhension de la différence , que les gens peuvent trouver intéressant.

Eh bien, ce n'est pas très différent, mais je séparerais la partie curry de l'appelant "Quelque chose d'appeler". partie:

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

Ensuite:

DoSomething(Apply(foo, 1));

De cette façon, vous pouvez réutiliser le code de traitement dans d'autres situations, y compris dans les cas où vous ne souhaitez pas appeler immédiatement le délégué qui vient d'être renvoyé. (Vous voudrez peut-être le curry plus tard, par exemple.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top