第二個例子比較簡單, 只是替換一個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#語言的任何標識符名稱。