3

InvocationExpressionSyntax ノードを、独自に構築した InvocationExpressionSyntax ノードに置き換えようとしています。

これまでに見つけた唯一の方法は SyntaxNode.ReplaceNodes<> を使用することですが、それがどのように機能するかについて頭を悩ませています。

ここにコードスニップがあります

public override SyntaxNode VisitInvocationExpression(InvocationExpressionSyntax node)
{
    InvocationExpressionSyntax replacementNode = (constructing my own invocation node, etc.

    node = (InvocationExpressionSyntax)node.ReplaceNodes(new List<InvocationExpressionSyntax>() { replacementNode /* ##Solution: This should be the EXISTING node, not the replacement node*/ }, new Func<InvocationExpressionSyntax, InvocationExpressionSyntax, SyntaxNode>((old, old2) =>
        {
            //return what?  old and old2 are both unmodified at this point. Doing another node.replacenodes in here doesn't work either. How do I replace node?
            //even the following doesn't work. 
            return replacementNode;
        }));
}

メソッドの Func<> 引数のメタデータ:

引数ノードの置換ノードを計算する関数。最初の引数は元のノードです。2 番目の引数は、置き換えられた子孫で書き換えられた同じノードです。

私が見つけたノードを置き換える方法は他にありません。構築した代替ノードを返却しても、元のノードが返却されるだけです。

ノード全体を単純に置き換えるにはどうすればよいですか?

4

2 に答える 2

4

あなたのコード スニペットは私を少し混乱させます。ReplaceNodes は、最初の引数で指定されたノードを置き換えるため、最初の引数は、新しいノードではなく、既存のノードのリストである必要があります。2 番目の引数のラムダで新しいノードを作成するだけで、それらがツリーで置き換えられます。現在置き換えているノードを知る必要がある場合は、2 つの引数のうち最初の引数 (この例では "old") を見て、それが何であるかを確認してください。

于 2012-08-15T05:45:29.767 に答える
2

今のところ見つけた回避策は次のとおりです。

node = node.WithExpression(replacementNode);
于 2012-08-15T03:16:20.420 に答える