質問

(パラメータのない)関数を受け取り、何らかの方法で処理するメソッド DoSomething を指定します。 「オーバーロード」を作成するより良い方法はありますか?以下のスニペットよりもパラメータを持つ関数の場合?

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);
}
役に立ちましたか?

解決

編集:コメントで述べたように、これはカリー化ではなく部分的なアプリケーションです。 違いの理解に関するブログ投稿、これは興味深いと思うかもしれません。

まあ、それは特に違いはありませんが、「DoSomethingの呼び出し」からカレー部分を分離します。パート:

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

その後:

DoSomething(Apply(foo, 1));

そのようにして、カリー化コードを他の状況で再利用できます-新しく返されたデリゲートをすぐに呼び出したくない場合を含む。 (たとえば、後でもっとカレーにしたいかもしれません。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top