Construire LambdaExpression pour la propriété imbriquée à partir de la chaîne

.net c# expression-trees lambda linq

Question

J'essaie de créer une expression lambda pour une propriété imbriquée au moment de l'exécution à partir du nom de la propriété. Fondamentalement, j'essaie de créer l'expression lambda spécifiée par:

var expression = CreateExpression<Foo, object>(foo => foo.myBar.name);

private static Expression CreateExpression<TEntity, TReturn>(Expression<Func<TEntity, TReturn>> expression)
{
    return (expression as Expression);
}

Avec les cours:

var expression = CreateExpression<Foo, object>(foo => foo.myBar.name);

private static Expression CreateExpression<TEntity, TReturn>(Expression<Func<TEntity, TReturn>> expression)
{
    return (expression as Expression);
}

Cependant, tout ce que je "myBar.name" est le type de Foo et la chaîne "myBar.name"

S'il s'agissait d'une propriété normale telle que nécessitant simplement la valeur "myBar" je pourrais utiliser les éléments suivants:

var expression = CreateExpression<Foo, object>(foo => foo.myBar.name);

private static Expression CreateExpression<TEntity, TReturn>(Expression<Func<TEntity, TReturn>> expression)
{
    return (expression as Expression);
}

Cependant, ce code ne fonctionne pas pour les propriétés imbriquées et je ne suis pas sûr de savoir comment créer le LambdaExpression pour faire le travail de foo.myBar.name .

Je pense que ça va être quelque chose comme ça:

var expression = CreateExpression<Foo, object>(foo => foo.myBar.name);

private static Expression CreateExpression<TEntity, TReturn>(Expression<Func<TEntity, TReturn>> expression)
{
    return (expression as Expression);
}

Mais je n'arrive pas à chercher comment tout fonctionne, ou s'il existe un meilleur moyen de le faire au moment de l'exécution.

Réponse acceptée

Tu veux dire:

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

Par exemple:

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

?




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi