Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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
使用DSL生成C#代码_C#_.net_Code Generation_Dsl - Fatal编程技术网

使用DSL生成C#代码

使用DSL生成C#代码,c#,.net,code-generation,dsl,C#,.net,Code Generation,Dsl,目前,我正在处理的项目没有完全固定的模型(由于外部影响),因此我希望在编写它们时有一定的灵活性。目前,它们跨应用程序的三个不同层(db、web api和客户端)进行复制,每个层都有相似的逻辑(即验证) 我想知道是否有一种方法可以让我编写一个模型文件(比如ruby),然后让它将该模型转换成必要的c#文件。目前看来,我只是在编写很多样板代码,这些代码在任何阶段都可能发生变化,而这种生成的方法将允许我专注于更重要的事情 有没有人推荐我使用这样的dsl/语言,有没有人有过类似的经验?我见过一个系统,它使

目前,我正在处理的项目没有完全固定的模型(由于外部影响),因此我希望在编写它们时有一定的灵活性。目前,它们跨应用程序的三个不同层(db、web api和客户端)进行复制,每个层都有相似的逻辑(即验证)

我想知道是否有一种方法可以让我编写一个模型文件(比如ruby),然后让它将该模型转换成必要的c#文件。目前看来,我只是在编写很多样板代码,这些代码在任何阶段都可能发生变化,而这种生成的方法将允许我专注于更重要的事情


有没有人推荐我使用这样的dsl/语言,有没有人有过类似的经验?

我见过一个系统,它使用分部类和分部方法来允许在不影响自定义代码的情况下重新生成代码。“规则引擎”完全是从Visio状态图生成的。这基本上是穷人的工作流程,但很容易修改。Viso图被导出为XML,并使用powershell和T4读入以生成类

上面的示例是外部DSL的示例。即,在应用程序运行的编程语言之外。另一方面,您可以创建一个在编程语言中实现和使用的内部DSL

这和以前的代码杂志都很好

在上面的链接中,Neal Ford向您展示了如何使用流畅的界面在C#中创建内部DSL

他还没有提到的一件事是,您可以将这个属性[EditorBrowsable(EditorBrowsableState.Never)]放在您的方法上,这样它们就不会显得有智能。这意味着您可以对DSL的用户隐藏类上的非DSL(如果愿意)方法,从而使fluent API更易于发现

通过使用TDD编写IoC容器,您可以在本视频系列中看到一个实时编写的流畅界面


关于外部DSL,您还有一个选择,它的功能非常强大,可以让您创建可以直接执行的外部DSL,而不是使用代码生成,而代码生成实际上根本不是DSL。

我认为您走的方向是正确的

在这种情况下,我通常会设计一种简单的语言来满足我的需求,并为其编写一个LL1(递归下降)解析器

如果语言中必须包含非平凡的C#语法,我可以引用它,或者把它放在我能识别的括号中,然后传递给输出代码

我可以让它生成一个解析树结构,然后从中生成3种不同的代码,或者让它动态生成代码,或者使用一个具有3个值的模式变量,或者只是同时将代码写入3个不同的输出文件


做这件事的方法不止一种。如果您害怕编写解析器(就像一些程序员一样),那么在其他方面会有很多帮助。

这很容易做到。如果输出足够相似,您可以简单地使用文本模板机制,否则它可以生成一个抽象语法树供您遍历。

许多成熟的编译器都是真正的代码生成器。原来的C++编译器cFAX生成了直的C代码,而Effeland Haskell也在编译之前将其编译成C。所有编译器都是代码生成器,它们可能不会产生人类友好的代码。甚至机器代码指令通常也只是由嵌入处理器中的微码解释的更高级别的指令。