C# Expression.Lambda 无法在运行时编译

标签 c# expression-trees

我有构建表达式解析器 CreateExpression() 返回构建的表达式树

Expression rule = CreateExpression(_BuyRuleString);
LambdaExpression lambda = Expression.Lambda(rule, _ParameterExpressions);
var func = lambda.Compile();

但是当我调用 lambda.Compile() 时失败

从范围“”引用了类型为“System.Int32”的变量“t1”,但未定义

所以我打印出表达式 lambda

.Lambda #Lambda1<System.Func`9[System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Double,System.Double,System.Boolean[]]>(
System.Int32 $t1,
System.Int32 $t2,
System.Int32 $t3,
System.Int32 $t4,
System.Int32 $t5,
System.Int32 $t6,
System.Double $r1,
System.Double $r2) {
.Call SwarmTrader.ExpressionParser.SeriesOperatorFunc.GTZ(.Call SwarmTrader.Indicator.RSI(
        $t1,
        "p"))
}

相当于

Expression<Func<int, int, int, int, int, int, double, double, bool[]>> test = (t1, t2, t3, t4, t5, t6, r1, r2) => SwarmTrader.ExpressionParser.SeriesOperatorFunc.GTZ(SwarmTrader.Indicator.RSI(t1, "p"));

但是 var func = test.Compile(); 有效。所以我尝试结合解决它...

lambda = Expression.Lambda(rule, _ParameterExpressions); // lambda.Compile() failed
lambda = Expression.Lambda(test.Body, _ParameterExpressions); // lambda.Compile() failed
lambda = Expression.Lambda(rule, test.Parameters); // lambda.Compile() failed
lambda = Expression.Lambda(test.Body, test.Parameters); // lambda.Compile() works

谁能指出为什么 lambda.Compile() 只能在 test 中工作?

最佳答案

很可能您的 CreateExpression() 没有引用 _ParameterExpressions 中的参数,而是定义了它自己的参数。您必须在正在编译的表达式树和 lambda 参数中使用相同 ParameterExpression

关于C# Expression.Lambda 无法在运行时编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12230033/

相关文章:

c# - LINQ-to-SQL : Convert Func<T, T, bool> 到表达式<Func<T, T, bool>>

c# - 使用 SFTP 从 FTP 站点上传下载文件

c# - 如何创建无重复的ConcurrentQueue?

c# - 使函数等待事件 C#

c# - View style设置为Details时如何在Winforms ListView中显示图标和文字?

c# - SOAP 和 REST 网络服务有什么区别? SOAP 可以是 RESTful 吗?

c# - 为什么不同版本的 .net(或编译器)会为相同的表达式生成不同的表达式树

c# - 强制 Expression<> 评估局部变量

c# - 将表达式树与 EF Core 结合使用会产生奇怪的 SQL 语句

c#-4.0 - 为仅在运行时已知的类型创建已编译的 Expession.Lambda