La compilation Lambda jette "variable" de type "référencée depuis la portée", mais elle n'est pas définie "

c# expression-trees runtime-compilation

Question

Lorsque je tente de compiler le lambda ci-dessous, il jette:

variable 'modèle' de type 'System.Collections.Generic.IEnumerable`1 [WheelEndCatalogKendo.Models.SapBasicData]' référée depuis scope '', mais n'est pas définie

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

Je vois plusieurs messages similaires; mais jusqu'à présent, ils ne m'ont pas informé du problème lié à mon code. Il semble que je fournisse la variable lambda (en tant que second paramètre). Je n'ai cependant presque aucune expérience en création d'arbres d'expression.

Des idées?

Réponse acceptée

Le problème est que le paramètre de model de l'expression firstItem n'est pas identique à modelParameter . Dans les arbres d'expression, les paramètres ne sont pas comparés par nom, mais par référence.

Cela signifie que la solution la plus simple consiste à réutiliser le paramètre de model de firstItem au lieu de créer votre propre paramètre:

var modelParameter = firstItem.Parameters.Single();

Avec cette modification, votre code fonctionnera.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow