【发布时间】:2013-01-25 15:53:20
【问题描述】:
我正在研究 System.CodeDom namespace 以生成与语言无关(至少在一定范围内)的源代码,并且我发现了一些不鼓励使用 CodeDom 的信息。
我认为this early blogpost 中描述的一些遗漏现在已经修复,CodeDom does not seem to provide a way to create a switch statement 仍然允许 - 性能降低? - 解决方法,而不用丑化生成类型的公共接口。这同样适用于automatic C# properties 和collection initializers。
但是,其他遗漏无法真正解决,例如inability to create finalizers、impossibility to declare extension methods 或lacking direct support of generic reference type constraints。
请注意,使用 CodeSnippetTypeMember 或通过任何其他方式注入文字源代码 sn-ps 的建议解决方案并不令人满意,因为它们与语言无关 - 从而消除了使用 CodeDom 而不是 String.Format 的全部意义使用文字代码 sn-ps。
最后,甚至有人建议 in this SO question 'CodeDom 是失败的,而表达式树(或者更确切地说是“语句”树)是前进的方向' - 尽管没有任何解释如何从 @ 实际获取任何源代码987654331@(除了classes cannot be declared with expression trees的限制。
CodeDom 是否仍然是生成源代码的首选方法,或者当前的 BCL 是否提供了任何我没想到的名称的晦涩替换?
【问题讨论】:
-
@DavidBrabant(以及driis,之前曾指出过这一点):谢谢,Roslyn 只是您无法找到的软件名称之一,除非您已经认识他们。在选择将其称为已接受的答案之前,我将花一些时间对此进行研究。
-
@O.R.Mapper 我认为这同样适用于 .Net 中大多数技术的名称:LINQ、Entity Framework 或 CodeDOM。
-
此外,您的要求有点矛盾:您想要的东西与语言无关,但同时支持所有特定于语言的功能。
-
@svick:的确,许多软件名称都受此影响,尽管您命名的名称仍然不言自明(在 LINQ 的情况下,至少如果您发现首字母缩写词代表什么)。尽管如此,我认为我的要求没有任何矛盾:IL 代码也不矛盾,只是因为它可以从具有特殊功能的各种语言编译成。而一些“特殊功能”只是在某些语言中编写某些代码元素的唯一方式,例如 C# 中扩展方法的
this关键字。
标签: .net code-generation codedom