C# 如何使用Roslyn修改源代码?

C# 如何使用Roslyn修改源代码?,c#,.net,roslyn,C#,.net,Roslyn,如何使用Roslyn修改源代码?我无法创建SyntaxNode并在SyntaxTree中插入。 或者使用替代品(Antrl、NRefactory或其他东西)?您可以使用SyntaxFactory创建SyntaxNodes 您不能修改现有的语法树(因为它是不可变的),但可以创建一个包含节点的新语法树。使用-和Add-方法查看,ReplaceNode和CSharpSyntaxVisitor。很难说哪一个最适合您的需要。svick如何回答您-您无法修改现有的语法树。Sytnax树是不可变的,但您可以基

如何使用Roslyn修改源代码?我无法创建SyntaxNode并在SyntaxTree中插入。
或者使用替代品(Antrl、NRefactory或其他东西)?

您可以使用
SyntaxFactory
创建
SyntaxNode
s


您不能修改现有的语法树(因为它是不可变的),但可以创建一个包含节点的新语法树。使用-和
Add-
方法查看
ReplaceNode
CSharpSyntaxVisitor
。很难说哪一个最适合您的需要。

svick如何回答您-您无法修改现有的语法树。Sytnax树是不可变的,但您可以基于现有树创建另一个树。为此,必须创建节点并替换现有节点。下面是一个简单的示例(使用更改):

如果是不可变的,下面是入门文档中的注释:

Roslyn API的一个基本原则是不变性。由于不可变的数据结构在创建后无法更改,因此可以由多个使用者同时安全地共享和分析这些数据结构,而不会出现一种工具以不可预测的方式影响另一种工具的危险。不需要锁或其他并发措施。这适用于语法树、编译、符号、语义模型以及Roslyn API中的所有其他数据结构。新对象不是修改,而是基于与旧对象的指定差异创建。您将把这个概念应用于语法树,以创建树转换


谢谢你的回答。我找到了NodeOrTokenList。如何将NodeOrTokenList强制转换为SyntaxNode?@user3382135您没有,我不明白您为什么要这样做。我想你应该问一个新问题,解释你想做什么,以及为什么你认为你需要NodeOrTokenList来做这个。我假设这段代码需要一个using语句,比如
using Syntax=Microsoft.codesanalysis.CSharp.SyntaxFactory编译。
var name = Syntax.QualifiedName(Syntax.IdentifierName("System"), Syntax.IdentifierName("Collections"));
name = Syntax.QualifiedName(name, Syntax.IdentifierName("Generic"));


SyntaxTree tree = SyntaxTree.ParseText(
@"using System;
using System.Collections;
using System.Linq;
using System.Text;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(""Hello, World!"");
        }
    }
}");

var root = (CompilationUnitSyntax)tree.GetRoot();

var oldUsing = root.Usings[1];
var newUsing = oldUsing.WithName(name);

root = root.ReplaceNode(oldUsing, newUsing);

Console.WriteLine(root.GetText());