Lambda编译抛出变量''类型为''从作用域''引用,但未定义

本文关键字:引用 作用域 未定义 变量 编译 Lambda 类型 | 更新日期: 2023-09-27 18:11:56

当我尝试编译如下所示的lambda时,它抛出:

变量'model'的类型'System.Collections.Generic.IEnumerable ' 1[WheelEndCatalogKendo.Models. models .]SapBasicData]'从作用域引用',但没有定义

public static GridBoundColumnBuilder<TModel> BuildColumnString<TModel>(this GridBoundColumnBuilder<TModel> column, WebViewPage<IEnumerable<TModel>> webViewPage, int width) where TModel : class {
    var modelParameter = Expression.Parameter(typeof(IEnumerable<TModel>), "model");
    Expression<Func<IEnumerable<TModel>, TModel>> firstItem = (model) => model.FirstOrDefault();
    var member = MemberExpression.Property(firstItem.Body, column.Column.Member);
    var lambda = Expression.Lambda<Func<IEnumerable<TModel>, string>>(member, modelParameter);
    var title = webViewPage.Html.DisplayNameFor(lambda).ToHtmlString();
    var header = webViewPage.Html.ShortLabelFor(lambda).ToHtmlString().FixUpNewLinesAsHtml();
    var compiled = lambda.Compile(); //Throws here with "variable '...' of type '...' referenced from scope '', but it is not defined"
....
}

我看到几个类似的帖子;但是到目前为止,他们还没有把我的代码的问题告诉我。似乎我提供了lambda变量(作为第二个参数参数)。但是,我几乎没有编写表达式树的经验。

任何想法?

Lambda编译抛出变量''类型为''从作用域''引用,但未定义

问题是firstItem表达式中的model参数与modelParameter不相同。在表达式树中,不按名称比较参数,而是按引用比较参数。

这意味着最简单的解决方案是重用firstItem中的model参数,而不是创建您自己的参数:

var modelParameter = firstItem.Parameters.Single();