我正在研究与语言无关(至少在一定范围内)源代码生成的System.CodeDom
命名空间CodeDom
,并且我发现了一些不鼓励使用.
我认为这篇早期博文中描述的一些遗漏现在已经得到修复,而且CodeDom
似乎没有提供创建switch
语句的方法这一事实仍然允许 - 性能降低?- 解决方法,而不用丑化生成类型的公共接口。这同样适用于自动 C# 属性和集合初始值设定项。
但是,其他遗漏无法真正解决,例如无法创建终结器、无法声明扩展方法或缺乏对泛型引用类型约束的直接支持。
请注意,使用CodeSnippetTypeMember
或通过任何其他方式注入文字源代码片段的建议解决方案并不令人满意,因为它们不是语言独立的 - 从而消除了使用CodeDom
而不是String.Format
文字代码片段的全部意义。
最后,在这个 SO 问题中甚至建议“CodeDom 是失败的,而表达式树(或者更确切地说是“语句”树)是前进的方向”——尽管没有任何解释如何从表达式树中实际获取任何源代码(除了不能用表达式树声明类的限制之外。
CodeDom 是否仍然是生成源代码的首选方法,或者当前的 BCL 是否提供了一个我没有想到的名称的模糊替换?