Die Lambda-Kompilierung löst "Variable" vom Typ "referenziert aus dem Bereich" aus, ist aber nicht definiert.

c# expression-trees runtime-compilation

Frage

Wenn ich versuche, das unten gezeigte Lambda zu kompilieren, gibt es Folgendes aus:

Variable 'model' vom Typ 'System.Collections.Generic.IEnumerable' 1 [WheelEndCatalogKendo.Models.SapBasicData] 'referenziert vom Gültigkeitsbereich' ', ist jedoch nicht definiert

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"
....
}

Ich sehe mehrere ähnliche Beiträge; aber bis jetzt haben sie mich nicht in das Problem mit meinem Code eingeweiht. Es scheint, als ob ich die Lambda-Variable (als zweites Parameterargument) anliege. Ich habe jedoch fast keine Erfahrung darin, Ausdrucksbäume zu erstellen.

Irgendwelche Ideen?

Akzeptierte Antwort

Das Problem besteht darin, dass der model aus dem firstItem Ausdruck nicht mit dem modelParameter . In Ausdrucksbäumen werden Parameter nicht nach Namen, sondern nach Referenz verglichen.

Das bedeutet, dass die einfachste Lösung darin besteht, den model von firstItem , anstatt einen eigenen Parameter zu erstellen:

var modelParameter = firstItem.Parameters.Single();

Mit dieser Änderung funktioniert Ihr Code.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow