c# - 用另一个 linq 表达式包装一个 linq 表达式

标签 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);

我唯一想不通的是如何将调用表达式转换为返回类型。如果我将返回类型设置为 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. 我已将签名更改为仅返回 Func<int>因为实际参数将在编译期间嵌入。

关于c# - 用另一个 linq 表达式包装一个 linq 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55392759/

相关文章:

C# 和 SQL 服务器 : inserting/update only truly executes when debugging

c# - 有 2 组数据的自连接表的条件 LINQ 查询

c# - 在父表达式中重用表达式结果

c# - 使用 JSON.NET 读取 JSON

c# - DataGridView 单击事件并不总是触发

c# - Silverlight 中的动态数据输入表单

C# 排序字母数字列表

c# - 使用LINQ有效地分页大型数据集

c# - 设置动态创建的枚举值的赋值表达式

entity-framework - 生成动态选择 lambda 表达式