是否有一些行业 "standard" 使用 c# 进行高级元编程?

Is there some industry "standard" for advanced meta programming in c#?

时不时地,在各种项目中,我会遇到 C# 项目中无法使用泛型解决的元编程情况,并且会从更强大的元编程工具中受益。我通常采用的解决方案是通过反射解决问题,使用 C++/cli,或引入自定义 xml/xslt 编译器步骤。

这是否反映了 C# 社区通常采用的方法,或者是否有我不知道的有价值的方法,例如广泛使用的第 3 方预处理器?

我不是在寻求产品推荐,我是在询问针对此常见问题的既定通用解决方案。 “不,没有”可能是有效且正确的答案。

不,没有。主要是因为它是一个边缘领域。不是说它没有用,只是说像 90% 到 95% 的人根本不会这样做。

有 2 种“广泛”使用的技术(部分原因是一些 .NET 工具,主要在 EntityFramework 中)确实使用了它们):

我会说在用例中,95% 是 T4,这基本上是旧的 Ef 4 编辑器,现在慢慢被各种 API 的客户端生成器所取代 - 是的,元编程是那么罕见。我觉得这部分是一种耻辱。我有时使用过代码生成器(odata,以前 ASP.NET 的基于 T4 的路由),但在大多数情况下,其他开发人员会睁大眼睛看它,甚至从未听说过这个概念。耻辱。

所以,绝对没有标准。

这是一个公认的差距,多年来经常被搁置,因为 .NET 具有 非常 良好的运行时 reflection/emit API,允许运行时 meta-programming解决方案;然而,这有多个问题,包括:

  1. 复杂性
  2. start-up 时间
  3. 安全隐患
  4. 并非在所有情况下都有效(某些 runtimes/platforms 禁止运行时发出)
  5. IL 链接器删除“未使用”代码的问题(因为在 构建时 没有任何内容触及这些 API,但在 运行时 它们通过运行时使用 reflection/emit)

正因为如此,在 C# 9 的时间范围内(但不特定于 C# 9),“生成器”看起来终于成为了一个“东西”。这提供了一个 Roslyn-based build-time meta-programming 层,可以以类似于今天 3rd 方库如何运送“分析器”的方式进行扩展(生成器和分析器在根本上是相似的)。

它可能是您正在寻找的“行业标准”,但它还处于起步阶段。 Intro post, from April 2020.

有很多方法可以在 .NET 中使用元编程。

  • Compile-time 工具:PostSharp、Fody 等
  • 运行时工具:Castle DynamicProxy、Unity Interception等
  • 代码生成工具:T4、Source Generators

但其中 none 个是标准的。

还可以考虑切换到其他编程语言,例如 Nemerle。它是一种支持卫生宏的语言。在我个人看来,这就是元编程的理想。