如何使用Roslyn正确修改类声明语法?

moh*_*sen 0 c# roslyn

我有一个方法来修改类声明语法.我StatementSyntax为类中的所有方法添加了两个属性,然后我将该类保存到我的解决方案中.一切都很好,但该方法ReplaceNode仅适用于第一种方法,ListOfMethod.我方法的哪一部分不正确?

private ClassDeclarationSyntax GetNewClass(ClassDeclarationSyntax c)
{
    List<MethodDeclarationSyntax>  ListOfMethod = lom(c);
    foreach (var OldMethod in ListOfMethod )
    {
        MethodDeclarationSyntax NewMethod = GetNewMethod (OldMethod);
        c = c.ReplaceNode(OldMethod,NewMethod);
    }
    return c;
}
Run Code Online (Sandbox Code Playgroud)

Tam*_*mas 5

在Roslyn中,大多数数据结构都是不可变的,因此当您对某些内容调用修改方法时,该操作将返回一个新的修改对象,而不是在适当的位置执行修改.

因此,在您的情况下,您收集给定的所有感兴趣的方法ClassDeclarationSyntax.当你调用时ReplaceNode,它返回一个新的类声明.这个新类声明不包含任何先前找到的方法,因为它是一个新的类声明实例.

一种选择是在一次通话中进行更改ReplaceNodes,在您的情况下,这似乎是要遵循的方法.

另一个选择是尝试使用在树修改期间不会丢失的永久标记来标记方法.要执行此操作,您可以向节点添加注释WithAdditionalAnnotations(),然后您可以在树中找到具有给定注释的给定节点.