将方法主体复制到属性

时间:2015-08-13 14:40:56

标签: c# refactoring roslyn

我正在尝试创建一个与方法具有相同主体的新属性。

到目前为止,这是我的代码:

private async Task<Solution> ConvertMethodToProperty(Document document, MethodDeclarationSyntax methodNode, CancellationToken cancellationToken)
{
    AccessorListSyntax accesors = SyntaxFactory.AccessorList(new SyntaxList<AccessorDeclarationSyntax>
    {
        SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration, methodNode.Body)
    });
    PropertyDeclarationSyntax newp = SyntaxFactory.PropertyDeclaration(new SyntaxList<AttributeListSyntax>(), methodNode.Modifiers, methodNode.ReturnType, methodNode.ExplicitInterfaceSpecifier, methodNode.Identifier, accesors);
    SyntaxNode root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
    document = document.WithSyntaxRoot(root.ReplaceNode(methodNode, newp));
    return document.Project.Solution;
    }
}

然而,当我在我的测试项目上运行时,我看到了:

enter image description here

即使代码中的methodNode.Body填充了我想要的方法体:

enter image description here

创建AccessorListSyntax时,我做错了什么?谢谢!

1 个答案:

答案 0 :(得分:4)

我认为您在SyntaxList上使用集合初始化程序无效。因为它将隐式调用SyntaxList上的Add方法,但add不会修改底层集合,它只返回一个新的SyntaxList。尝试实例化,然后像这样手动添加。

var accessorList = new SyntaxList<AccessorDeclarationSyntax>();
accessorList = accessorList.Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration, methodNode.Body));
当我开始和Roslyn一起玩时,我陷入了同样的陷阱,只需记住不变性的事情。