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和运行之间发生变化,结果会有所不同。

我只是好奇会有什么好处。您是否试图向函数的使用者隐藏输入参数?只要变量是传递给它的本地变量,就可以了。

就解决方案而言,不会有一个,因为 .NETFunc<>完全出于相同的原因创建了 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 回答