使用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.
相关产品推荐
相关产品推荐

