Analyse d'arbres d'expression lambda

c# expression-trees lambda

Question

J'essaie d'utiliser des expressions lambda dans un projet pour mapper une API de requête tierce. Donc, j'analyse manuellement l'arbre d'expression.

Si je passe dans une expression lambda comme:

p => p.Title == "title"

tout fonctionne.

Cependant, si mon expression lambda ressemble à:

p => p.Title == "title"

Avec le débogueur .NET, je ne vois pas la valeur réelle de cette fonction. Au lieu de cela, je vois quelque chose comme:

p => p.Title == "title"

Ce qui donne? Et lorsque j'essaie de saisir le côté droit de l'expression sous forme de chaîne, j'obtiens (value(ASP.usercontrols_myaspusercontrol_ascx).myaspdropdown.SelectedValue) place de la valeur réelle. Comment puis-je obtenir la valeur réelle?

Réponse acceptée

N'oubliez pas que lorsque vous utilisez l'expression lambda comme un arbre d'expression, vous ne disposez pas de code exécutable. Vous avez plutôt une arborescence d'éléments d'expression qui composent l'expression que vous avez écrite.

Charlie Calvert a un bon post qui en parle en détail. Voici un exemple d'utilisation d'un visualiseur d'expressions pour le débogage d'expressions.

Dans votre cas, pour obtenir la valeur du côté droit de l'expression d'égalité, vous devez créer une nouvelle expression lambda, la compiler, puis l'invoquer.

J'ai hacké un exemple rapide de ceci - espérons que cela répond à vos besoins.

public class Class1
{
    public string Selection { get; set; }

    public void Sample()
    {
        Selection = "Example";
        Example<Book, bool>(p => p.Title == Selection);
    }

    public void Example<T,TResult>(Expression<Func<T,TResult>> exp)
    {
        BinaryExpression equality = (BinaryExpression)exp.Body;
        Debug.Assert(equality.NodeType == ExpressionType.Equal);

        // Note that you need to know the type of the rhs of the equality
        var accessorExpression = Expression.Lambda<Func<string>>(equality.Right);
        Func<string> accessor = accessorExpression.Compile();
        var value = accessor();
        Debug.Assert(value == Selection);
    }
}

public class Book
{
    public string Title { get; set; }
}

Réponse populaire

Pour obtenir la valeur réelle, vous devez appliquer la logique de l'arborescence des expressions à votre contexte.

L'intérêt des arbres d'expression est qu'ils représentent la logique sous forme de données plutôt que d'évaluer l'expression. Vous aurez besoin de comprendre ce que l'expression lambda signifie vraiment. Cela peut vouloir dire en évaluer certaines parties par rapport à des données locales - vous devrez le décider vous-même. Les arbres d'expression sont très puissants, mais l'analyse et l'utilisation ne sont pas simples. (Demandez à n'importe qui qui a écrit un fournisseur LINQ ... Frans Bouma a déploré les difficultés à plusieurs reprises.)




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