[C#]SourceGenerator实战: 对任意对象使用await吧!!!

前言本文记录一次简单的 SourceGenerator 实战,最终实现可以在代码中 await 任意类型对象,仅供娱乐,请勿在生产环境中使用!!!
关键技术:

  • SourceGenerator
    • 【[C#]SourceGenerator实战: 对任意对象使用await吧!!!】在编译时动态生成代码的技术 。官方文档:源生成器
    • 关于 IncrementalGenerator 的基本使用可以参考 dotnet 用 SourceGenerator 源代码生成技术实现中文编程语言
    • SourceGenerator 除了提供附加文件进行代码生成,还有丰富的语法树、类型等分析API
    • SourceGenerator 只能拓展代码,不能替换代码
  • Await anything
    • C#中的 async/await 最终由编译器编译为状态机,其核心逻辑在于 await 对象需要实现符合要求的 GetAwaiter 方法,这个方法可以是 拓展方法
    • 参见官方博客 await anything;
那么要实现对任何对象的 await 我们的思路大概如下:
  1. 找到所有的 await 语法
  2. 检查 await 的对象是否有 GetAwaiter 方法
  3. 为没有 GetAwaiter 方法的对象生成 GetAwaiter 拓展方法
得益于 SourceGenerator 丰富的分析API,我们可以很容易的办到这件事

    经验总结扩展阅读