【问题标题】:Lambda compilation throws "variable '' of type '' referenced from scope '', but it is not defined"Lambda编译抛出“从范围''引用的''类型的变量'',但未定义”
【发布时间】:2013-05-03 01:21:21
【问题描述】:

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

从范围“”引用了“System.Collections.Generic.IEnumerable`1[WheelEndCatalogKendo.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 变量(作为第二个参数参数)。然而,我几乎没有创作表达式树的经验。

有什么想法吗?

【问题讨论】:

    标签: c# expression-trees runtime-compilation


    【解决方案1】:

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

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

    var modelParameter = firstItem.Parameters.Single();
    

    有了这个修改,你的代码就可以工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      • 2015-10-08
      • 1970-01-01
      相关资源
      最近更新 更多