Roslyn入門(2): 替換一個using的例子

第二個例子比較簡單, 只是替換一個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,代表簡單的單個標識符名稱,例如SystemMicrosoft
  • GenericNameSyntax,代表通用類型或方法名稱,例如List
  • QualifiedNameSyntax,它表示形式合格的名稱,<left-name>.<right-identifier-or-generic-name>例如System.IO
  • AliasQualifiedNameSyntax,它使用程序集外部別名來表示名稱,例如LibraryV2 :: Foo 
  • 通過將這些名稱組合在一起,您可以創建C#語言的任何標識符名稱。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章