c# - DSL:从 DSL 规则到 C# 表达式

标签 c# compiler-construction designer dsl dsl-tools

这个问题可能很复杂,让我扩展一下:

  • 是否存在一个设计器( stub /框架/元设计器)来根据 .NET 对象公共(public) bool 属性创建基于 AND/OR 的规则?保存为任何 DSL/Boo/... 输出。
  • 是否可以将 DSL 输出编译为 C# 表达式?

我们的主要问题是文档和代码之间的差距。我们的产品基于数百个用户定义的规则,我们希望加快更改请求的速度。

如果我们能够为用户提供一个简单的设计器并获取输出,那么在将其翻译/编译为 C#/IL 代码后,我们就有一个快速的更改请求周期。

我知道我们的问题很具体,但欢迎任何“墙上的砖 block ”!

示例:

C# 类,主题:

public class TestA
{
     public bool B {...}
     public bool C {...}
}

在设计器中,我们应该能够创建

  • 任何类型的图形设计器(即用于选择公共(public)属性的下拉列表)

DSL 输出:

If TestA.B AND TestA.C Then Return True;

C# 输出:

if (testA.B && testA.C) { return true; }

更新#1

我很高兴有一种支持使用静态类型 .NET 类的 DSL 语言。我的意思是,如果用户可以检查代码(示例中的“Output in DSL”),我们就不需要设计器。

更新#2

根据提示,我用表情树凝视。几天后,我遇到了 DLinq - 我从来都不是 DLinq 的忠实粉丝,但在这种情况下,它非常适合问题领域。

  • 易于将(A > 2 AND B < 4) OR C = 5解析为表达式树
  • 轻松创建这样的表达式
  • 非常容易序列化/反序列化
  • 基于 FlowLayoutPanel 的 GUI 作为“表达式生成器”可以正常工作

最佳答案

你可以自己构建这样的东西。

您可以使用 Type.GetMembers() 获取类的所有公共(public)属性的列表

但是,我不会生成 C# 代码,而是使用表达式树。

这样,当用户更改规则时,您不需要涉及 C# 编译器。相反,您可以将规则存储在数据库中,在运行时加载它们,然后使用 Expression.Compile() 方法创建一个委托(delegate),您可以调用该委托(delegate)来运行代码。

更新:

在评论中有人问“Expression Tress 和领域特定语言有什么区别?”

答案如下:

表达式树和领域特定语言是正交的。

表达式树只是一个用于表示 C# 表达式的 API,可以在运行时方便地动态转换为委托(delegate)。

DSL(即领域特定语言)是一种旨在解决一小类问题的编程语言。

本质上,它们是完全不同的东西。

如果您愿意,可以使用表达式树作为 DSL 实现的一部分。 Linq 将它们用于此目的。

但是,就您而言,您不需要 DSL。您需要的是一个生成规则的用户界面(类似于 Outlook 的工作方式),然后是执行这些规则的方法。

创建 UI 只是正常的 UI 开发。

表达式树可以用来实现规则。

关于c# - DSL:从 DSL 规则到 C# 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/946450/

相关文章:

php - 将 C 编译器嵌入网页

.net - Windows 窗体设计器因某个窗体而永久损坏

c# - Microsoft Visual Studio 和 C# : How to Visually Add Events to Controls?

c# - 在 linq 查询中调用 c# 方法( Entity Framework )

c# - 分割 10k 页 PDF 时出现内存泄漏(iTextSharp PDF API)

C# 捕获 webbrowser 发出的 http 请求

wpf - 如何解决 WPF 设计器错误 'The type {0} does not support direct content' .'?

c# - 如何填充由 Activator.CreateInstance() 方法创建的实例

haskell - Haskell 是用什么语言编写的?

java - 为什么我的 Java 类在编译时会创建多个 .class 文件?