C# 使用SyntaxNode.ReplaceNode替换同一树中的多个节点

C# 使用SyntaxNode.ReplaceNode替换同一树中的多个节点,c#,roslyn,C#,Roslyn,我目前正在使用Roslyn对语法树进行三方合并。我在classdeclarationsyntax节点上的所有子节点之间有一个匹配项,我想对这些子节点执行合并,然后基于该合并创建一个新树 O是输入classdeclarationsyntax,匹配有三个memberdeclarationsyntax类型的成员(A、O、B) var updated = O; foreach (var m in matching) { if (m.A != null && m.B != null

我目前正在使用Roslyn对语法树进行三方合并。我在
classdeclarationsyntax
节点上的所有子节点之间有一个匹配项,我想对这些子节点执行合并,然后基于该合并创建一个新树

O是输入
classdeclarationsyntax
,匹配有三个
memberdeclarationsyntax
类型的成员(A、O、B)

var updated = O;
foreach (var m in matching)
{
    if (m.A != null && m.B != null && m.O != null) {
        var merge = Merge(m.A, m.O, m.B);
        var oldUpdated = updated;
        updated = updated.ReplaceNode(m.O, merge);
    }
    else if (m.A == null && m.O == null && m.B != null)
        updated = updated.AddMembers(m.B);
    else if (m.A != null && m.O == null && m.B == null)
        updated = updated.AddMembers(m.A);
}
这是行不通的。在第二次迭代中,
ReplaceNode
返回一个完全未修改的节点(
oldUpdated==updated
true

似乎在循环的第一次迭代之后,所有子对象都已重建为新对象,并且在子对象列表中无法再找到存储在“我的匹配”中的原始子对象(
updated.ChildNodes()。其中(x=>x==m.O)
为空)

这样做的好方法是什么?

我目前的方法:

var updateMember = new Dictionary<MemberDeclarationSyntax, MemberDeclarationSyntax>();
var addMembers = new List<MemberDeclarationSyntax>();

foreach (var m in matching) {
    if (m.A != null && m.B != null && m.O != null) {
        var mergeChild = Merge(m.A, m.B, M.O);
        updateMember.Add(m.O, child);
    }
    else if (m.A == null && m.O == null && m.B != null) 
        addMembers.Add(m.B);
    else if (m.A != null && m.O == null && m.B == null)
        addMembers.Add(m.A);
}

var merged = O.ReplaceNodes(updateMember.Keys.AsEnumerable(), (n1, n2) =>
{
    return updateMember[n1];
}).AddMembers(addMembers.ToArray());
var updateMember=new Dictionary();
var addMembers=新列表();
foreach(匹配中的var m){
如果(m.A!=null和&m.B!=null和&m.O!=null){
var mergeChild=合并(m.A、m.B、m.O);
updateMember.Add(m.O,child);
}
else if(m.A==null&&m.O==null&&m.B!=null)
添加成员。添加(m.B);
如果(m.A!=null&&m.O==null&&m.B==null),则为else
添加成员。添加(硕士);
}
var merged=O.ReplaceNodes(updateMember.Keys.AsEnumerable(),(n1,n2)=>
{
返回updateMember[n1];
}).AddMembers(AddMembers.ToArray());

我相信您应该能够使用注释来实现这一点。