C#Lambda中的变量参数

iam*_*iam 13 c# lambda params

是否可以使用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)