C# 中的高级元编程是否有一些行业“标准”?

问题描述 投票:0回答:4

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

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

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

c# .net metaprogramming preprocessor
4个回答
5
投票

这是一个公认的差距,多年来一直被搁置,因为 .NET 具有 非常好的运行时反射/发射 API,允许运行时元编程解决方案;然而,这有多个问题,包括:

    复杂性
  1. 启动时间
  2. 安全隐患
  3. 并非在所有情况下都有效(某些运行时/平台禁止运行时发出)
  4. IL 链接器删除“未使用”代码的问题(因为在
  5. build time 没有任何东西触及这些 API,但在runtime 它们通过运行时反射/发射使用)
正因为如此,在 C# 9 的时间框架内(但不特定于 C# 9),“生成器”看起来终于成为了一个“东西”。这提供了一个基于 Roslyn 的构建时元编程层,可以以类似于今天 3rd 方库如何运送“分析器”的方式进行扩展(生成器和分析器在根本上是相似的)。

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

介绍帖,自 2020 年 4 月起.


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

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

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

所以,绝对没有标准。


1
投票
在 .NET 中使用元编程的方法有很多。

    编译时工具:PostSharp、Fody等
  • 运行时工具:Castle DynamicProxy、Unity Interception等
  • 代码生成工具:T4、Source Generators
但是没有一个是标准的。

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


0
投票
今天最好的元编程平台,在我看来是

Roslyn APIs,它绝对棒极了。它是为现代 .NET 构建的,所以它不是一些古老的垂死图书馆……而且我还发现,ChatGPT(Bing Chat)非常了解 Roslyn API,因此它可以为您提供显着帮助。您可以使用 ChatGPT / Bing Chat / GitHub Copilot 更快地编写生成器和分析器:)

但是现在有一个基于 Roslyn API 的新工具,叫做

Metalama。它是 最近发布的,我非常喜欢并推荐这个工具。它是 PostSharp(众所周知的方面框架)的现代重写,但它基于 Roslyn API 并与现代 .NET 一起工作,并且它有一些 PostSharp 中没有的新的和非常好的功能:)

它允许您非常轻松地创建方面,还可以进行各种分析、代码修复、在有人违反您的代码库规则时创建警告等等……而且它很好地集成到 Visual Studio 和 VS Code 中,所以您可以使用“Metalama Diff”在设计时查看转换后的代码,还可以轻松调试转换后的代码。

您可以将 Metalama 与 Roslyn API 结合使用,这要归功于 Aspect Weavers,它甚至允许您对 C# 代码进行任意转换 :) 这完全让我着迷,因为 Roslyn API 本身甚至不可能做到这一点 :D

而且这个 Metalama 工具是全新的,适用于现代 .NET 并在设计时运行,因此与 Castle DynamicProxy 等古老的运行时库相比,它具有许多优势。 与 T4 模板等模板语言相比,Metalama 使用 T# 模板语言感觉更现代。

如果您对现代元编程方式感兴趣,可以加入 Reddit 上的这两个社区 :)

https://www.reddit.com/r/MetalamaFramework/

https://www.reddit.com/r/RoslynAPI/

© www.soinside.com 2019 - 2024. All rights reserved.