2017-02-19 55 views
1

我想包分配到動態Func<..>內的λ和動態調用它,但它會引發有關參數計數異常。DynamicInvoke參數的數量不匹配,期望數

MCVE

using System; 

public class Test 
{ 
    public static void Main() 
    { 

     // your code goes here 
     try { 
      dynamic plus = new Func<long, long, long>((a, b) => a + b); 
      Type functionType = plus.GetType(); 
      int arity = functionType.GetGenericArguments().Length - 1; 
      Console.WriteLine("Arity {0}", arity); 
      long[] parameters = new long[arity]; 

      long result = plus.DynamicInvoke(parameters); 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 
} 

例外:Number of parameter does not match expected count.

回答

2

DynamicInvoke需要一個object數組作爲參數,而不是一個long陣列。

這應該工作:

var result = plus.DynamicInvoke(parameters.Cast<object>().ToArray()); 
+1

而不是鑄造和分配一個全新的陣列,它可能會更好聲明'parameters'爲對象[]開始與 –

+1

@KevinGosse,我同意。雖然在這種特殊情況下,動態調用委託的成本遠高於數組的分配。重點是輸入需要是一個'object []'。 –