大佬教程收集整理的这篇文章主要介绍了c# – 使用SyntaxNode.ReplaceNode替换同一树中的多个节点,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
O是输入ClassDeclerationSyntax,匹配有三个成员MemberDeclerationSyntax的成员(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 == mO)为空).
这样做有什么好办法?
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());
以上是大佬教程为你收集整理的c# – 使用SyntaxNode.ReplaceNode替换同一树中的多个节点全部内容,希望文章能够帮你解决c# – 使用SyntaxNode.ReplaceNode替换同一树中的多个节点所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。