2017-02-19 17 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パラメータ、ないlong配列としてobject配列をとります。

これは動作するはずです:

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

よりもむしろブランドの新しい配列をキャストし、割り当てを、それが –

+1

@KevinGosseを開始するために[] 'オブジェクトとしてparameters'を宣言するために、おそらくより良いですが、私は同意するものとします。この特定のケースでは、デリゲートを動的に呼び出すコストは、配列の割り当てよりもはるかに高くなります。要点は、入力は 'object []'でなければならないということです。 –

関連する問題