обернуть выражение linq другим выражением linq - PullRequest
5 голосов
/ 28 марта 2019

Я думал, если без написания ExpressionVisitor можно решить эту проблему

Expression<Func<int, int, int>> multiply = (n1, n2) => n1 * n2;

Expression<Func<int, Expression<Func<int, int, int>>, Expression<Func<int, int>>>> power2 = 
              (adad, tabe) => Expression.Invoke(tabe, 
                                   Expression.Constant(adad), Expression.Constant(adad));

power2.Compile()(2, multiply);

, единственное, что я не могу понять, - это как преобразовать выражение вызова в возвращаемый тип.если я устанавливаю тип возвращаемого значения dynamic, то он выглядит нормально, но мне интересно, есть ли лучший вариант сделать это

1 Ответ

2 голосов
/ 28 марта 2019

Попробуйте что-то вроде этого:

Expression<Func<int, Expression<Func<int, int, int>>, Expression<Func<int>>>> power2 =
    (o, f) => Expression.Lambda<Func<int>>(Expression.Invoke(
                  f, Expression.Constant(o), Expression.Constant(o)));

, а затем выражение будет:

var r = power2.Compile()(4, multiply);
//r = {() => Invoke((n1, n2) => (n1 * n2), 4, 4)}

, если вы хотите вызвать r затем:

var r = power2.Compile()(4, multiply).Compile()();
//r is 16

nb Я изменил сигнатуру, чтобы она возвращала только Func<int>, потому что фактический аргумент будет уже встроен во время компиляции.

...