由SyntaxNode.ReplaceNodes<>()混淆

时间:2012-08-15 01:48:09

标签: c# immutability roslyn

我正在尝试用我自己构造的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&lt;&gt;的元数据arg的方法:

  

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

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

以下是我现在找到的替代方法:

node = node.WithExpression(replacementNode);