是否可以使用C#lambda/delegate来获取可以使用Dynamic-invoke调用的可变数量的参数?
我在这种情况下使用'params'关键字的所有尝试都失败了.
来自答案的工作代码更新:
delegate void Foo(params string[] strings);
static void Main(string[] args)
{
Foo x = strings =>
{
foreach(string s in strings)
Console.WriteLine(s);
};
//Added to make it clear how this eventually is used :)
Delegate d = x;
d.DynamicInvoke(new[]{new string[]{"1", "2", "3"}});
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ade 15
直接传递参数时它不起作用的原因DynamicInvoke()是因为DynamicInvoke()需要一个对象数组,一个元素用于目标方法的每个参数,而编译器会将一个数组解释为params数组DynamicInvoke()而不是一个参数到目标方法(除非你把它作为一个单独的方法object).
您还可以DynamicInvoke()通过传递包含目标方法的参数数组的数组来调用.外部数组将被接受作为DynamicInvoke()单个params参数的参数,内部数组将被接受为目标方法的params数组.
delegate void ParamsDelegate(params object[] args);
static void Main()
{
ParamsDelegate paramsDelegate = x => Console.WriteLine(x.Length);
paramsDelegate(1,2,3); //output: "3"
paramsDelegate(); //output: "0"
paramsDelegate.DynamicInvoke((object) new object[]{1,2,3}); //output: "3"
paramsDelegate.DynamicInvoke((object) new object[]{}); //output: "0"
paramsDelegate.DynamicInvoke(new []{new object[]{1,2,3}}); //output: "3"
paramsDelegate.DynamicInvoke(new []{new object[]{}}); //output: "0"
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6921 次 |
| 最近记录: |