C#-Roslyn:SyntaxNode转换为FieldDeclarationSyntax

问题描述

我有一个字段SyntaxNode:

            CancellationTokenSource source = new CancellationTokenSource();
            CancellationToken token = source.Token;
            SyntaxNode root = await CSharpSyntaxTree.ParseText("int i= 0;").GetRootAsync(token);

我看到了文档

Inheritance->Object->SyntaxNode->
CSharpSyntaxNode->
MemberDeclarationSyntax->BaseFieldDeclarationSyntax->FieldDeclarationSyntax

我有ClassDeclarationSyntax

private ClassDeclarationSyntax _classDeclaration;

我想将SyntaxNode转换为FieldDeclarationSyntax,然后将其添加到ClassDeclarationSyntax

我应该如何处理?

解决方法

您可以使用以下方法做您想要的事情:

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using System.Linq;

VariableDeclarationSyntax variableDeclaration = CSharpSyntaxTree.ParseText("int i= 0;")
    .GetRoot()
    .DescendantNodes()
    .OfType<VariableDeclarationSyntax>()
    .Single();

_classDeclaration = _classDeclaration
    .WithMembers(
        SyntaxFactory.SingletonList<MemberDeclarationSyntax>(
            SyntaxFactory.FieldDeclaration(variableDeclaration)));

您首先需要通过解析来创建变量声明语法。然后下降根节点以检索它。然后将该节点附加到新的FieldDeclaration。虽然我很好奇您在这里想做什么。如果需要帮助更改树的代码,则使用SyntaxRewriter类型。在Microsoft.CodeAnalysis.Editing命名空间下,还有通用的Codefix基础结构和SyntaxEditor