Lambda 编译抛出“从范围 '' 引用的类型 '' 的变量 '',但未定义”

2024-03-09

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

类型为“System.Collections.Generic.IEnumerable`1[WheelEndCatalogKendo.Models.SapBasicData]”的变量“model”从范围“”引用,但未定义

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 变量(作为第二个参数)。然而,我几乎没有创作表达式树的经验。

有任何想法吗?


问题是model参数来自firstItem表达式不一样modelParameter。在表达式树中,参数不是按名称比较,而是按引用比较。

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

var modelParameter = firstItem.Parameters.Single();

通过此修改,您的代码将起作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lambda 编译抛出“从范围 '' 引用的类型 '' 的变量 '',但未定义” 的相关文章

随机推荐