Albero delle espressioni per un accesso membro di profondità> 1

c# expression expression-trees lambda linq

Domanda

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; }
}

Se voglio creare un albero di espressioni di un membro accedi a Employee.Name questo è quello che faccio:

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

Qual è l'equivalente di questo per un utente che accede a Employee.Job.Salary?

Risposta accettata

Hai bisogno:

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

Fondamentalmente stai prendendo la proprietà Salary dal risultato della valutazione di x.Job .

Se hai bisogno di farlo in modo programmatico, avrai bisogno di qualcosa come:

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché