c# - ejemplos - linq expression builder
Construir LambdaExpression para propiedad anidada de una cadena (1)
Quieres decir:
static LambdaExpression CreateExpression(Type type, string propertyName) {
var param = Expression.Parameter(type, "x");
Expression body = param;
foreach (var member in propertyName.Split(''.'')) {
body = Expression.PropertyOrField(body, member);
}
return Expression.Lambda(body, param);
}
Por ejemplo:
class Foo {
public Bar myBar { get; set; }
}
class Bar {
public string name { get; set; }
}
static void Main() {
var expression = CreateExpression(typeof(Foo), "myBar.name");
// x => x.myBar.name
}
?
Estoy intentando crear una expresión lambda para una propiedad anidada en tiempo de ejecución a partir del nombre de propert. Básicamente, estoy tratando de crear la expresión lambda especificada por:
var expression = CreateExpression<Foo, object>(foo => foo.myBar.name);
private static Expression CreateExpression<TEntity, TReturn>(Expression<Func<TEntity, TReturn>> expression)
{
return (expression as Expression);
}
Con las clases:
class Foo
{
public Bar myBar { get; set; }
}
class Bar
{
public string name { get; set; }
}
Sin embargo, todo lo que me dan es el tipo de Foo
y la cadena "myBar.name"
Si fuera una propiedad normal, como solo necesitar el valor "myBar"
, podría usar lo siguiente:
private static LambdaExpression GetPropertyAccessLambda(Type type, string propertyName)
{
ParameterExpression odataItParameter = Expression.Parameter(type, "$it");
MemberExpression propertyAccess = Expression.Property(odataItParameter, propertyName);
return Expression.Lambda(propertyAccess, odataItParameter);
}
Sin embargo, este código no funciona para las propiedades anidadas y no estoy seguro de cómo crear LambdaExpression para hacer el trabajo de foo.myBar.name
.
Creo que va a ser algo como esto:
GetExpression(Expression.Call(GetExpression(Foo, "myBar"), "name"))
Pero parece que no sé cómo hacer que todo funcione, o si hay una forma mejor de hacerlo en tiempo de ejecución.