Qu&#39;est-ce que ExpressionVisitor.Visit <T> Faire?

c#-4.0 expression-trees expressionvisitor linq

Question

Avant que quelqu'un crie la réponse, veuillez lire la question.

Quel est le but de la méthode dans ExpressionVisitor de .NET 4.0:

public static ReadOnlyCollection<T> Visit<T>(ReadOnlyCollection<T> nodes, Func<T, T> elementVisitor)

Ma première hypothèse quant au but de cette méthode était de visiter chaque nœud de chaque arborescence spécifiée par le paramètre nodes et de réécrire l'arborescence à l'aide du résultat de la fonction elementVisitor .

Cela ne semble pas être le cas. En fait, cette méthode semble faire un peu plus que rien, à moins que je ne manque quelque chose ici, que je soupçonne fortement que je suis ...

J'ai essayé d'utiliser cette méthode dans mon code et lorsque les choses ne se sont pas déroulées comme prévu, j'ai réfléchi sur la méthode et constaté:

public static ReadOnlyCollection<T> Visit<T>(ReadOnlyCollection<T> nodes, Func<T, T> elementVisitor)

Alors, où quelqu'un irait-il réellement à propos de l'utilisation de cette méthode? Qu'est-ce que j'oublie ici?

Merci.

Réponse acceptée

Cela me semble être une méthode pratique pour appliquer une fonction de transformation aribitrary à un arbre d’expression et renvoyer l’arbre transformé ainsi obtenu ou l’arborescence originale s’il n’ya pas de changement.

Je ne vois pas en quoi ce motif diffère d'un motif utilisé par un visiteur d'expression standard, à l'exception de l'utilisation d'un type de visiteur, il utilise une fonction.

Comme pour l'utilisation:

Expression<Func<int, int, int>> addLambdaExpression= (a, b) => a + b;

// Change add to subtract
Func<Expression, Expression> changeToSubtract = e => 
{ 
    if (e is BinaryExpression) 
    { 
        return Expression.Subtract((e as BinaryExpression).Left,
                                   (e as BinaryExpression).Right); 
    }
    else
    {
        return e;
    }
};  

var nodes = new Expression[] { addLambdaExpression.Body }.ToList().AsReadOnly();
var subtractExpression = ExpressionVisitor.Visit(nodes, changeToSubtract);

Vous n'expliquez pas comment vous vous attendiez à ce qu'il se comporte et pourquoi donc vous pensez que cela ne fait guère plus que rien.




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