这个问题也许是复合的,让我扩展一下:


是否存在设计人员(stub / framework / meta-designer)根据.NET对象公共布尔属性创建基于AND / OR的规则?保存为任何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

根据提示,我盯着表情树。几天后,我遇到了DLinq-我从不喜欢DLinq,但是在这种情况下,它非常适合问题领域。


易于解析(A> 2 AND B 易于创建这样的表达式
非常容易序列化/反序列化
基于FlowLayoutPanel的GUI可以很好地用作“表达式生成器”

最佳答案

您可以自己建立类似的东西。

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

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

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

更新:

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

答案是:

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

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

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

从本质上讲,它们是完全不同的事物。

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

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

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

表达式树是您可以用来实现规则的东西。

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

10-12 06:44