【问题标题】:Is it possible to chain source generators in .net?是否可以在.net 中链接源生成器?
【发布时间】:2021-09-23 12:14:52
【问题描述】:

我有一个项目,我将 INotifyPropertyChanged 实现为源生成器,我希望能够在我的各种以 MVVM 为中心的项目中使用它。

该项目使用将属性应用于部分类中的字段的方法,它将为这些字段生成属性。

然而,我当前的项目是基于 Monogame 的,并且 UI 框架本身不支持绑定,所以我想我会使用另一个源生成器来避免反射的解决方案。

不幸的是,在我的 INotifyPropertyChanged 源生成器中生成的属性似乎在我的 MLEM.Ui.Binding 源生成器中不可见。我只得到原始源代码中的属性。

有没有办法让 INotifyPropertyChanged 源生成器先运行,然后在我的第二个绑定源生成器中使用它生成的源代码?

我尝试过的事情:

  • 按照我想要的顺序(双向)排列我的项目引用
  • EmitCompilerGeneratedFilesCompilerGeneratedFilesOutputPath 设置为目录(我努力排除 obj/Debug/generated 中的文件,所以我最终得到了重复的类)

【问题讨论】:

  • 不,不能链接源生成器
  • 目前,不,这是不可能的;它已经被提出了几次,但是关于排序、循环、依赖等以及这些问题的性能存在很多非常复杂的问题,所以现在采取的方法是“保持简单:生成器是独立的,不能互相看到”
  • 听起来我短期内最大的希望是重构我的代码,以便我可以将两个生成器合二为一。

标签: c# roslyn csharp-source-generator


【解决方案1】:

Marc Gravell 解释说,这个问题的答案是否定的。

话虽如此,我已经成功地解决了这个问题,但不是通过在单个编译单元中链接多个源生成器。

我很幸运,我将绑定生成为一组扩展方法,这意味着我可以将我的 ViewModel 及其 INPC 源生成器移动到它自己的项目中,然后让我的绑定源生成器在原始项目上运行.

这意味着当绑定源生成器检查时,ViewModel 程序集的输出已经稳定,组装的 INPC 代码已经到位。

这可能并不适合所有人,但也许它开启了一种可能性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 2014-12-13
    • 2019-08-07
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多