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<> arg 的元数据:

计算参数节点的替换节点的函数。第一个参数是原始节点。第二个参数是用替换的后代重写的同一节点。

没有其他方法可以替换我能找到的节点。即使我返回我构建的替换节点,它也只是返回原始节点。

如何简单地替换整个节点?

4

2 回答 2

4

你的代码片段让我有点困惑。ReplaceNodes 替换第一个参数中指定的节点,因此第一个参数应该是现有节点的列表,而不是新节点。您可以在 lambda 中为第二个参数创建新节点,然后在树中替换这些节点。如果您必须知道当前正在替换哪些节点,请查看两个参数中的第一个(在您的示例中为“旧”)以了解它是什么。

于 2012-08-15T05:45:29.767 回答
2

这是我现在找到的解决方法:

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