Estoy aprendiendo árboles de expresión en C#.Variable local y árboles de expresión
estoy atascado ahora por un tiempo:
string filterString = "ruby";
Expression<Func<string, bool>> expression = x => x == filterString;
¿Cómo puedo construir esta expresión por código? No hay una muestra de cómo capturar una variable local. Esta es fácil:
Expression<Func<string, bool>> expression = x => x == "ruby";
Esto sería:
ParameterExpression stringParam = Expression.Parameter(typeof(string), "x");
Expression constant = Expression.Constant("ruby");
BinaryExpression equals = Expression.Equal(stringParam, constant);
Expression<Func<string, bool>> lambda1 =
Expression.Lambda<Func<string, bool>>(
equals,
new ParameterExpression[] { stringParam });
Las impresiones de depuración para el siguiente (x => x == FilterString):
{x => (x == valor (Predicate.Program + <> c__DisplayClass3) .filterString)}
Gracias por arrojar algo de luz sobre este tema.
Gracias. La sugerencia para ver el código MSIL generado es muy útil. – yonexbat
Algo como 'var hoistedConstant = Expression.Property (Expression.Constant (new {Value = filterString})," Value ");' debería hacerlo – Appetere
@Appetere ¿Qué pasa con 'Expression.Constant (filterString)'? Es cierto que no reflejaría cambios en la variable, pero tampoco su sugerencia. –