[C#]SourceGenerator實戰: 對任意對象使用await吧!!!

前言本文記錄一次簡單的 SourceGenerator 實戰,最終實現可以在代碼中 await 任意類型對象,僅供娛樂 , 請勿在生產環境中使用?。。?
關鍵技術:

  • SourceGenerator
    • 在編譯時動態生成代碼的技術 。官方文檔:源生成器
    • 關于 IncrementalGenerator 的基本使用可以參考 dotnet 用 SourceGenerator 源代碼生成技術實現中文編程語言
    • SourceGenerator 除了提供附加文件進行代碼生成,還有豐富的語法樹、類型等分析API
    • SourceGenerator 只能拓展代碼,不能替換代碼
  • Await anything
    • C#中的 async/await 最終由編譯器編譯為狀態機,其核心邏輯在于 await 對象需要實現符合要求的 GetAwaiter 方法,這個方法可以是 拓展方法
    • 參見官方博客 await anything;
那么要實現對任何對象的 await 我們的思路大概如下:
  1. 找到所有的 await 語法
  2. 檢查 await 的對象是否有 GetAwaiter 方法
  3. 為沒有 GetAwaiter 方法的對象生成 GetAwaiter 拓展方法
【[C#]SourceGenerator實戰: 對任意對象使用await吧!!!】得益于 SourceGenerator 豐富的分析API,我們可以很容易的辦到這件事

    推薦閱讀