La compilación Lambda lanza "variable '' de tipo '' referenciada desde el alcance '', pero no está definida"

c# expression-trees runtime-compilation

Pregunta

Cuando intento compilar la lambda que se muestra a continuación, lanza:

variable 'modelo' de tipo 'System.Collections.Generic.IEnumerable`1 [WheelEndCatalogKendo.Models.SapBasicData]' referenciado desde el alcance '', pero no está definido

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

Veo varios mensajes similares; pero hasta el momento no me han informado del problema con mi código. Parece que estoy suministrando la variable lambda (como el argumento del segundo parámetro). Sin embargo, casi no tengo experiencia en la creación de árboles de expresión.

¿Algunas ideas?

Respuesta aceptada

El problema es que el parámetro de model de la expresión firstItem no es el mismo que modelParameter . En los árboles de expresiones, los parámetros no se comparan por nombre, sino por referencia.

Esto significa que la solución más sencilla es reutilizar el parámetro del model de firstItem , en lugar de crear su propio parámetro:

var modelParameter = firstItem.Parameters.Single();

Con esta modificación, su código funcionará.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow