将方法体复制到 属性
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 时,我陷入了同样的陷阱,只需要记住不变性。
我正在尝试创建一个新的 属性,其主体与方法相同。
到目前为止,这是我的代码:
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 时,我陷入了同样的陷阱,只需要记住不变性。