2017-02-19 3 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, я согласен. Хотя в этом конкретном случае стоимость динамического вызова делегата намного выше, чем распределение массива. Главное, что вход должен быть «объектом []». –

Смежные вопросы