用另一个linq表达式包装linq表达式

Mo *_*d A 5 c# linq expression-trees

我在想如果不编写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);
Run Code Online (Sandbox Code Playgroud)

我不知道的唯一一点是如何将调用表达式转换为返回类型。如果我将返回类型设置为,dynamic那么看起来不错,但是我想知道是否有更好的选择

Joh*_*nny 2

尝试这样的事情:

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)));
Run Code Online (Sandbox Code Playgroud)

那么表达式为:

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

如果你想调用的r话:

var r = power2.Compile()(4, multiply).Compile()();
//r is 16
Run Code Online (Sandbox Code Playgroud)

注意:我已将签名更改为 return 只是Func<int>因为实际参数在编译期间已嵌入。