将方法体复制到 属性

Copy Method Body To Property

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

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

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;
    }
}

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

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

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

我认为您在 SyntaxList 上使用集合初始化器是无效的。因为这将在您的 SyntaxList 上隐式调用 Add 方法,但添加不会修改基础集合,它只是 returns 一个新的 SyntaxList。像这样尝试实例化并在之后手动添加。

var accessorList = new SyntaxList<AccessorDeclarationSyntax>();
accessorList = accessorList.Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration, methodNode.Body));

当我开始使用 Roslyn 时,我陷入了同样的陷阱,只需要记住不变性。