通过 Func<>传递参数

本文关键字:参数 Func 通过 | 更新日期: 2023-09-27 18:34:39

我使用带有lambda表达式的委托,而不是只有一行代码的方法,例如:

Func<int, int, int> Add = (x, y) => x + y;
int Result = Add(1, 2); // 3

现在我遇到了一个问题,我需要未知数量的参数。有没有像这样解决它:

 Func<string, params string[], string> MergeFormat = (Look, values) => string.Format(Look, string.Join("-", values));

params string[]

结果将是

string.Format(func, string.Join("-", v1, v2, v3)); //currently
MergeFormat(func, v1, v2, v3); //new

通过 Func<>传递参数

params不是

类型本身的一部分,因此您无法指定Func<string, params string[], string>。但是你可以声明自己的委托,这些委托类似于Func,但有一个参数数组作为最终参数。例如:

using System;
delegate TResult ParamsFunc<T, TResult>(params T[] arg);
delegate TResult ParamsFunc<T1, T2, TResult>(T1 arg1, params T2[] arg2);
delegate TResult ParamsFunc<T1, T2, T3, TResult>(T1 arg1, T2 arg2, params T3[] arg3);
// etc        
class Program
{
    static void Main(string[] args)
    {
        ParamsFunc<string, string, string> func =
            (format, values) => string.Format(format, string.Join("-", values));
        string result = func("Look here: {0}", "a", "b", "c");
        Console.WriteLine(result);
    }
}

你不能这样做,但有一个解决方法,你可以使用:

如果以这种方式定义 Func:

Func<string[], string> FuncArray = (listOfStrings) => 
{
    // Here you can work on the listOfStrings, process it... 
    // and finaly you return a string from this method... 
}

然后,您可以稍后以这种方式在其他调用中使用该 FuncArray:

public void MyMethod(Func<string[], string> delegateMethod, params string[] listOfString)
{
    if (delegateMethod != null)
    {
        string value = delegateMethod(listOfStrings);
    }
}

因此,您只需定义一个 Func<>它将字符串数组作为参数,然后您可以从另一个具有"params string[]"参数的方法调用该 Func<>。