Arbre d'expression pour un accès membre de profondeur> 1

c# expression expression-trees lambda linq

Question

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 je veux créer un arbre d'expression d'un accès membre à Employee.Name, voici ce que je fais:

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

Quel est l'équivalent de ceci pour un accès membre à Employee.Job.Salary?

Réponse acceptée

Vous avez besoin:

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

Fondamentalement, vous prenez la propriété Salary partir du résultat de l'évaluation de x.Job .

Si vous devez le faire de manière programmatique, vous aurez besoin de quelque chose comme:

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow