2013-05-02 29 views
1

當我嘗試編譯如下所示的拉姆達,它拋出: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變量(作爲第二個參數參數)。然而,我幾乎沒有編寫表達樹的經驗。

任何想法?

回答

8

的問題是,從firstItem表達model參數是不一樣的modelParameter。在表達式樹中,參數不是按名稱進行比較,而是通過引用進行比較。

這意味着,最簡單的解決方案是從firstItem重用,而不是創建自己的參數model參數:

var modelParameter = firstItem.Parameters.Single(); 

經過這樣的修改,您的代碼將工作。

相關問題