第二个例子比较简单, 只是替换一个using, 这里似乎展示了一种不用ReWriter重载就能修改代码的方法, 但是多次尝试后发现也只能替换using而已, 插入一个using还没找到办法实现, 是什么原因呢? 可能有的老师说的对, 不会让我们做改变node树的修改,否则会导致树的顺序改变的问题, 所以先不尝试了,仅仅记录下来. 原文参考: https://github.com/dotnet/roslyn/wiki/Getting-Started-C%23-Syntax-Transformation
using System;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using System.Threading.Tasks;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
namespace ConstructionCS
{
class Program
{
static async Task Main(string[] args)
{
SyntaxTree tree = CSharpSyntaxTree.ParseText(
@"using System;
using System.IO;
using System.Linq;
using System.Text;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(""Hello, World!"");
}
}
}");
NameSyntax name = IdentifierName("System");
name = QualifiedName(name, IdentifierName("Collections"));
name = QualifiedName(name, IdentifierName("Generic"));
var root = (CompilationUnitSyntax)tree.GetRoot();
var oldUsing = root.Usings[1];
var newUsing = oldUsing.WithName(name);
// 把第二项using System.IO 替换成 using System.Collections.Generic;
root = root.ReplaceNode(oldUsing, newUsing);
Console.WriteLine(root.GetText());
}
}
}
照抄翻译:NameSyntax是C#中出现的四种类型的名称的基类:
- IdentifierNameSyntax,代表简单的单个标识符名称,例如System和Microsoft
- GenericNameSyntax,代表通用类型或方法名称,例如List
- QualifiedNameSyntax,它表示形式合格的名称,
<left-name>.<right-identifier-or-generic-name>
例如System.IO - AliasQualifiedNameSyntax,它使用程序集外部别名来表示名称,例如LibraryV2 :: Foo
- 通过将这些名称组合在一起,您可以创建C#语言的任何标识符名称。