这个问题也许是复合的,让我扩展一下:
是否存在设计人员(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/