Árbol de expresiones para un miembro acceso de profundidad> 1

c# expression expression-trees lambda linq

Pregunta

public class Job
{
    public string Name { get; set; }
    public int Salary { get; set; }
}
public class Employee
{
    public string Name { get; set; }
    public Job Job { get; set; }
}

Si quiero crear un árbol de expresiones de un acceso de miembro a Employee.Name, esto es lo que hago:

        var param = Expression.Parameter(type, "x");
        var memberAccess = Expression.PropertyOrField(param, memberName);
        return Expression.Lambda<Func<TModel, TMember>>(memberAccess, param);

¿Cuál es el equivalente a esto para que un miembro acceda a Employee.Job.Salary?

Respuesta aceptada

Necesitas:

var jobProperty = Expression.PropertyOrField(param, "Job");
var salaryProperty = Expression.PropertyOrField(jobProperty, "Salary");

Básicamente, estás tomando la propiedad Salary del resultado de evaluar x.Job .

Si necesita hacer esto de manera programática, necesitará algo como:

Expression expression = Expression.Parameter(type, "x");
foreach (var property in properties.Split('.'))
{
    expression = Expression.PropertyOrField(expression, property);
}


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