2009-06-03 122 views
1

的问题是可能复合,让我展开:DSL:从DSL规则到C#表达式

  • 确实存在一个设计师(存根/框架/元设计师)来创建和/或基于基于.NET对象公共布尔属性的规则?保存为任何DSL/Boo/...输出。
  • 是否有可能将DSL输出编译为C#表达式?

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

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

我知道我们的问题是特定的,但任何“砖墙”都是值得欢迎的!

C#类,主题:

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

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

  • 任何类型的图形设计(即下拉选择公共房产)

输出在DSL:

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

在C#输出:

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

更新#1

我将很高兴与支持使用静态类型的.NET的DSL语言类。我的意思是如果用户可以检查代码(“在DSL中输出”在这个例子中),我们不需要设计者。

更新#2

基础上TIPP,我呆住了与表达式树。几天后,我遇到了DLinq - 我从来都不是DLinq的忠实粉丝,但在这种情况下非常适合问题领域。

  • 容易解析(A> 2和B < 4)或C = 5到表达式树
  • 轻松创建像
  • 非常容易序列表达/基于
  • GUI反序列化在FlowLayoutPanel工作正常,因为“表达式生成器”

回答

5

您可以构建像这样的自我。

你可以得到一个类的所有公共属性的使用Type.GetMembers()的列表

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

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

更新:

在评论中有人问“?表达发辫和领域特定语言之间的区别是什么?”

这里的答案:

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

表达式tress只是一个表示C#表达式的API,可以在运行时方便地将其转换为委托。

DSL或领域特定语言是一种编程语言,旨在解决一小类问题。

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

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

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

创建UI只是普通的UI开发。

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

+0

我们的域对象测试器应用程序使用反射来填充公共属性并创建该对象的一个​​实例,所以这就好了。 表达式树听起来不错 - 你能给我一些关于DSL与ET的链接吗? 谢谢 – boj 2009-06-04 13:10:50