2014-10-20 167 views

回答

3

您可以使用SyntaxFactory创建SyntaxNode

而且您不能修改现有的语法树(因为它是不可变的),但是您可以创建一个包含您的节点的新树。请看With-Add-方法,ReplaceNodeCSharpSyntaxVisitor。很难说哪一个最适合您的需求。

+0

感谢您的回答。我找到了NodeOrTokenList。如何将NodeOrTokenList转换为SyntaxNode? – user3382135 2014-10-20 09:58:05

+1

@ user3382135你没有,我不明白你为什么要这么做。我想你应该问一个新问题,解释你想做什么,为什么你认为你需要NodeOrTokenList。 – svick 2014-10-20 10:13:57

2

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

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()); 

在这里永恒不变的情况下,从入门文档记:

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

+0

我假设这段代码需要像using'using Syntax = Microsoft.CodeAnalysis.CSharp.SyntaxFactory;'这样的using语句进行编译。 – Anssssss 2017-08-14 18:39:03