我正在尝试用我自己构造的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的方法:
计算参数节点的替换节点的函数。首先 参数是原始节点。第二个参数是重写的同一节点 替换后代。
没有其他方法可以替换我能找到的节点。即使我返回我构建的替换节点,它也只返回原始节点。
如何简单地替换整个节点?
答案 0 :(得分:4)
您的代码段让我感到困惑。 ReplaceNodes替换第一个参数中指定的节点,因此第一个参数应该是现有节点的列表,而不是新节点。您可以在lambda中为第二个参数创建新节点,并在树中替换它们。如果您必须知道当前正在替换哪个节点,请查看两个参数中的第一个(示例中为“old”)以了解它是什么。
答案 1 :(得分:2)
以下是我现在找到的替代方法:
node = node.WithExpression(replacementNode);