1

さまざまな種類の Func デリゲートを変換するための組み込みメソッドはありますか? つまり、Func が必要であるが、Func を持っている (そして、T パラメーターに渡す必要がある値を持っている) とします。例えば:

static TREsult Foo<TResult>(Func<TResult> f)
{
   // ...
   TResult result = f();
   // ...
   return result;
}

static int MyFunc(int i)
{
    return i;
}

void CallFoo()
{
    Func<int> func = ConvertFunc(MyFunc, 1); // Does this family of methods exist?
    int j = Foo(func);
}

私は次のように自分で書きました:

    static Func<TResult> ConvertFunc<T, TResult>(Func<T, TResult> f1, T t)
    {
        return () => f1(t);
    }

    static Func<TResult> ConvertFunc<T1, T2, TResult>(Func<T1, T2, TResult> f2, T1 t1, T2 t2)
    {
        return () => f2(t1, t2);
    }

    // etc.

しかし、このようなメソッドのファミリが存在するかどうか (または、これを行うためのより良い方法がある場合でも) 疑問に思っています。

基本的に、私はこれを、メソッドにいくつかの定型コードがあり、その後に関数呼び出しが続く場合 (関数の数と型は異なりますが、戻り値の型は同じです)、その後にさらにボイラーが続く場合にこれを行っています。プレートコード。

すべての意見を歓迎します!ありがとう。

4

1 に答える 1

3
static Func<TResult> ConvertFunc<T, TResult>(Func<T, TResult> f1, T t)
{
    return () => f1(t);
}

私には、この種のコードは少し危険に見えます。それ自体が悪いわけではありませんが、注意が必要です。関数に入力変数を埋め込むためにクロージャを使用しています。しかし、これは困難なバグにつながる可能性があります。変換Funcと実行の間に変数が変化すると、結果が異なるためです。

どんなメリットがあるのか​​気になるところです。関数のコンシューマから入力パラメータを隠そうとしていますか? 変数がそれに渡されたローカル変数である限り、問題ありません。

解決策に関しては、 .NET がFunc<>まったく同じ理由で 16 の異なるジェネリックを作成したため、解決策はありません。

おそらくリフレクションを使用してソリューションを実装できますが、関数を呼び出すためにペナルティを支払うことになります。MethodInfo.GetGenericArguments()タイプを提供し、それを使用MethodInfo.MakeGenericMethod()して新しいタイプを作成できます。


アップデート

私の要点を説明するために:

    static int Double(int number)
    {
        return number * 2;
    }

    static void Main(string[] args)
    {

        int i = 2;
        Func<int> f = () => Double(i);
        i = 3;
        Console.WriteLine(f()); // prints 6 and not 4

    }
于 2011-04-01T22:58:55.133 に答える