Variable de LambdaExpression referenciada desde el alcance pero no definida

c# expression-trees

Pregunta

Tengo una expresión lambda simple que me gustaría compilar e invocar

Expression< Func< Commands, bool>> expression = c => c.IsValid("test");

pero cuando hago lo siguiente:

LambdaExpression le = Expression.Lambda(expression.Body);

object result = le.Compile().DynamicInvoke();

La compilación arroja el error:

variable 'c' de tipo 'ConsoleApplication1.Commands' referenciado desde el alcance '', pero no está definido

¿Cómo se establece la variable de instancia para esta expresión?

Respuesta popular

¿Por qué no simplemente compilar la expresión en sí? Si desea invocarlo con alguna instancia específica de 'ConsoleApplication1.Commands' varias veces, podría simplemente cerrar esa instancia:


var validator = expression.Compile();

var c = new Commands();
var validatorForC = () => validator(c);

De lo contrario, necesitarás construir una expresión de llamada, como esta:


var c = new Commands();
var le = Expression.Lambda(Expression.Invoke(expression, Expression.Constant(c)));
object result = le.Compile().DynamicInvoke();

o puede hacer ExpressionVisitor que reemplazará todas las apariciones del parámetro 'c' en 'expression.Body' con Expression.Constant.



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