You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用System.Linq.Expressions处理条件Lambda表达式编译异常咨询

问题根因

表达式树的参数匹配是按实例引用匹配,而非参数名匹配。你手动创建的Expression.Parameter(typeof(TType), "x")和传入Lambda中使用的参数x是两个完全独立的实例,因此原条件表达式condTest中引用的参数在新构造的Lambda作用域中无法找到对应定义,就会抛出作用域未找到变量的异常。

修复方案

单参数场景下无需手动创建新参数实例,直接复用传入表达式自带的参数即可,修改Conditional分支的代码如下:

if (expression.Body.NodeType == ExpressionType.Conditional)
{
    ConditionalExpression condExp = (ConditionalExpression)expression.Body;
    var condTest = condExp.Test;
    // 直接复用原Lambda表达式的参数实例,不要新建
    var paramExpression = expression.Parameters[0];
    var lambda = Expression.Lambda(condTest, paramExpression);
    var deleg = lambda.Compile();
    var testResult = deleg.DynamicInvoke(Data);
    // 示例中此处输出为False,符合DisplayName长度为10的测试场景
    Console.WriteLine($"条件计算结果:{testResult}");
}

如果后续需要处理多参数、参数重绑定等复杂场景,可以自定义ExpressionVisitor遍历表达式树替换参数实例,当前场景直接复用原参数即可满足需求。


内容的提问来源于stack exchange,提问作者André D.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:06:06