我正在尝试创建一个与方法具有相同主体的新属性。
到目前为止,这是我的代码:
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时,我做错了什么?谢谢!
答案 0 :(得分:4)
我认为您在SyntaxList
上使用集合初始化程序无效。因为它将隐式调用SyntaxList上的Add
方法,但add不会修改底层集合,它只返回一个新的SyntaxList。尝试实例化,然后像这样手动添加。
var accessorList = new SyntaxList<AccessorDeclarationSyntax>();
accessorList = accessorList.Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration, methodNode.Body));
当我开始和Roslyn一起玩时,我陷入了同样的陷阱,只需记住不变性的事情。