Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 您在.NET中使用代码生成做什么?_C#_Code Generation - Fatal编程技术网

C# 您在.NET中使用代码生成做什么?

C# 您在.NET中使用代码生成做什么?,c#,code-generation,C#,Code Generation,您使用代码生成的目的是什么?允许动态运行时c#代码生成获得实际价值的典型场景有哪些? 具体地说:您使用CodeDOM名称空间的目的是什么?我们有一个规则引擎,它将规则建模为XML,但出于性能原因,将其部署为编译对象。代码生成允许我们获取XML并将其转换为标准的.NET组件。你一定会喜欢这个代码域。我测试了一个应用程序,它的UI是用XAML描述的。我从XAML为UI测试自动化生成屏幕接口类。动态代码生成?你是说在运行时?我使用它来创建对代码的高性能访问,而这些代码将以其他方式使用反射。大多数情况下

您使用代码生成的目的是什么?允许动态运行时c#代码生成获得实际价值的典型场景有哪些?
具体地说:您使用CodeDOM名称空间的目的是什么?

我们有一个规则引擎,它将规则建模为XML,但出于性能原因,将其部署为编译对象。代码生成允许我们获取XML并将其转换为标准的.NET组件。你一定会喜欢这个代码域。

我测试了一个应用程序,它的UI是用XAML描述的。我从XAML为UI测试自动化生成屏幕接口类。

动态代码生成?你是说在运行时?我使用它来创建对代码的高性能访问,而这些代码将以其他方式使用反射。大多数情况下,您可以使用诸如
Delegate.CreateDelegate
之类的工具,但有时
ILGenerator
等工具会占据一席之地

我在中使用它在运行时访问字段(通过构建包装器;注意属性使用
Delegate.CreateDelegate
),并在中创建更快的
PropertyDescriptor
实现。但在这两种情况下,我都直接使用
ILGenerator
,而不是CodeDom

事实上,就我个人而言,我真的不会费心去学习代码,除非我不得不这样做;对于运行时工作,我将首先查看
表达式
。我有一篇关于讨论这个的文章,或者在这里讨论一些有趣的事情



如果您指的是常规的codegen,即在编译时(或之前),那么任何对实现单独建模的场景都会使用它。LINQ到SQL(SqlMetal)、EF等都是经典的例子,但许多其他建模者都有codegen。对于protobuf net,我使用xslt作为;我不想使用T4,因为我想支持2.0/mono等,xslt允许最终用户使用记事本定制codegen(如果他们选择)。

通过在运行时创建适配器,这是一个很好的例子,说明何时需要使用代码dom

我不直接这样做,但我确实使用该库为单元测试动态生成mock和stub。我相信它是在幕后使用的,这反过来又称为Reflection.Emit。

代码生成的一个花哨词汇是“部分求值”。也就是说,如果你有一个程序P(X,Y),它接受两个输入X和Y,其中X很少变化,Y经常变化,那么你可以编写一个代码生成器,它接受X作为输入,并创建一个新的特殊程序PX(Y),当P的第一个参数是一个特定的X值时,它的运行速度非常快,因为它不需要处理X,因为X是它的“内置”参数。PX的生成很简单,因为它不需要处理Y

示例:有一次,我接管了一个项目,构建了一座从旧的层次数据库到新的关系数据库的“桥梁”。输入是X(数据库模式描述)和Y(旧数据库)。X很少变化,但Y经常变化。设计了P(X,Y)。设计文件厚约2英寸,预计需要2人18个月才能完成,性能是一个主要问题

由于其中一个输入X很少更改,因此这看起来像是代码生成的工作。编写了一个C程序来读取X并打印出一个新的C程序PX(Y)。然后PX大约每周重新生成一次,编译并链接,整个星期用于生产。它以高速运行,因为它不需要处理X,只需要处理Y。完成的代码生成器(C)只有0.5英寸厚,由两个人在3个月内完成


顺便说一下,编译器就是这样做的。它们获取程序X的文本描述,并将其转换为可运行的程序PX,然后该程序处理输入Y,只处理CodeDOM?反射.发射呢?我用键盘和编辑器动态生成代码。到目前为止效果还不错。。。(/mustnotgrin/)2黑:发射?发射操作码?太低级了:)@Andy:Castle.DynamicProxy、LinFu等帮你做吧。你永远看不到任何辐射,但它们在那里。