你用什么代码生成?什么是允许从动态运行时c#代码生成中获得实际价值的典型场景? 具体来说:你使用CodeDOM名称空间做什么?
答案 0 :(得分:2)
动态代码?你的意思是在运行时?我使用它来创建对其他方面使用反射的代码的高性能访问。很多时候你可以使用像Delegate.CreateDelegate
这样的东西,但有时ILGenerator
等有它们的位置。
我在protobuf-net中使用它来在运行时访问字段(通过构建包装器;请注意属性使用Delegate.CreateDelegate
),并在HyperDescriptor中创建更快的PropertyDescriptor
实现。但在这两种情况下,我直接使用ILGenerator
- 而不是CodeDom。
事实上,个人我真的不愿意学习CodeDom,除非我不得不这样做;对于运行时工作,我会首先查看Expression
。我有一篇关于InfoQ讨论此内容的文章,或者有关SO或my blog上可能有趣的各种内容。
如果您指的是常规代码生成 - 即在编译时(或之前),那么任何与实现分别建模的场景都会使用它。 LINQ-to-SQL(SqlMetal),EF等将是典型的例子,但许多其他建模者都有codegen。对于protobuf-net,我使用xslt作为codegen (from .proto);我不想使用T4,因为我想支持2.0 / mono等,而xslt允许最终用户使用记事本自定义codegen(如果他们愿意的话)。
答案 1 :(得分:2)
我没有直接这样做,但我确实使用Moq库来动态生成模拟和存根以进行单元测试。我相信在幕后使用Castle.DynamicProxy,后者又称为Reflection.Emit。
答案 2 :(得分:1)
我们有一个规则引擎,其规则以XML格式建模,但出于性能原因而部署为编译对象。代码生成允许我们获取XML并将其转换为标准.NET组件。你必须喜欢CodeDOM。
答案 3 :(得分:0)
我测试了一个在XAML中描述其UI的应用程序。我从XAML生成用于UI测试自动化的屏幕界面类。
答案 4 :(得分:0)
Duck typing通过在运行时创建适配器是恕我直言,这是一个很好的例子,当使用代码dom是必要的。
答案 5 :(得分:-1)
代码生成的一个奇特的词是“部分评估”。也就是说,如果你有一个程序P(X,Y)带有两个输入X和Y,其中X很少变化,而Y经常变化,那么你可以编写一个代码生成器,它将X作为输入并创建一个新的ad-hoc程序PX(Y),当它的第一个参数是X的特定值时,它完全正如P所做的那样。它运行得很快,因为它不需要处理X,因为X是“内置”的。 PX的生成很简单,因为它不需要处理Y.
示例:我接手一个项目,从旧的分层数据库到新的关系数据库构建“桥梁”。输入是X(数据库模式描述)和Y(旧数据库)。 X很少变化,但Y经常变化。 P(X,Y)已经设计好了。设计文件大约2英寸厚,预计需要2人18mos完成,性能是一个主要问题。
由于其中一个输入X很少变化,这看起来像是代码生成的工作。编写C程序以读取X并打印出新的C程序PX(Y)。然后,PX每周重新生成一次,编译和链接,并使用整周进行生产。它高速运行,因为它不需要处理X,只需要处理Y.完成的代码生成器(在C中)只有0.5英寸厚,在3个月内由2人完成。
顺便说一句,这就是编译器的作用。他们对程序X进行文本描述,并将其转换为可运行的程序PX,然后处理输入Y,