这个问题可能很复杂,让我扩展一下:
- 是否存在一个设计器( 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/