如何交换两个 SyntaxNode (Roslyn C#)

How to swap two SyntaxNode (Roslyn C#)

我目前正在为 visual studio 2015 编写一个重构工具,我想创建一个重新排序 class 元素的重构。我的问题:我无法在 SyntaxTree 中交换两个 SyntaxNode。基本的swap方法不起作用,因为SyntaxNode是一个引用类型,下面的代码执行后结果是firstSyntaxNode的两个副本。

SyntaxNode tmp = firstSyntaxNode;
root = root.ReplaceNode(firstSyntaxNode, secondSyntaxNode);
root = root.ReplaceNode(secondSyntaxNode, tmp);

如何交换两个 SyntaxNode?

您可以通过调用 ReplaceNodes:

同时替换两个节点
root = root.ReplaceNodes(new[] { firstSyntaxNode, secondSyntaxNode },
    (original, _) => original == firstSyntaxNode ? secondSyntaxNode : firstSyntaxNode);