用另一个 linq 表达式包装一个 linq 表达式
wrap a linq expression with another linq expression
我在想如果不写一个 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);
我唯一想不通的是如何将调用表达式转换为return类型。如果我将 return 类型设置为 dynamic
那么它看起来不错,但我想知道是否有更好的选择
尝试这样的事情:
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
n.b. 我只将签名更改为 return Func<int>
因为实际参数将在编译期间嵌入。
我在想如果不写一个 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);
我唯一想不通的是如何将调用表达式转换为return类型。如果我将 return 类型设置为 dynamic
那么它看起来不错,但我想知道是否有更好的选择
尝试这样的事情:
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
n.b. 我只将签名更改为 return Func<int>
因为实际参数将在编译期间嵌入。