我正在尝试使用 Roslyn 合并两个 C# 文件内容。我需要用较新的方法替换旧版本中的某些方法(标记为更新)。我遍历了两个文档中的所有成员,并将需要更改的方法标记为列表。
class Token
{
public string Name; // unique identifier
public SyntaxNode Node; // actual node in the document
}
现在我有两个令牌列表,即 OldTokens 和 NewTokens。我需要用相应的新方法覆盖旧方法。
foreach (Token oldt in OldTokens)
{
Token newt = NewTokens.Find(m => m.Name == oldt.Name);
if (newt != null)
{
DocumentRoot = DocumentRoot.ReplaceNode(oldt.Node, newt.Node);
}
}
它没有工作。我认为这可能是因为 DocumentRoot 没有在其直接成员列表中保存旧节点,因为它会出现在命名空间->类->成员的层次结构的深处。所以我尝试了类似的东西:
var nd = existing.Node.Parent.ReplaceNode(existing.Node, miss.Node);
var d2 = existing.Node.Parent.Parent.ReplaceNode(existing.Node.Parent, nd);
DocumentRoot = existing.Node.Parent.Parent.Parent.ReplaceNode(existing.Node.Parent.Parent, d2) as CompilationUnitSyntax;
这是有效的,但太难处理了。当存在嵌套类时,它会变得一团糟。有没有更好的办法?
其次,在结果中,我缺少代码注释。我尝试使用 ReplaceNode 方法的重载,这很令人困惑,因为它不会采用新的方法节点。
谢谢