我使用带有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
答案 0 :(得分:3)
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);
}
}
答案 1 :(得分:0)
您不能这样做,但有一个可以使用的解决方案:
如果你这样定义你的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&lt;&gt;将一个字符串数组作为参数,然后你可以调用该函数&lt;&gt;来自另一个具有“params string []”参数的方法。