2

问题可能是复合的,让我扩展它:

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

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

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

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

示例

AC# 类,主题:

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 AND B < 4) OR C = 5解析为表达式树
  • 轻松创建这样的表达式
  • 非常容易序列化/反序列化
  • 基于 FlowLayoutPanel 的 GUI 可以很好地作为“表达式生成器”
4

2 回答 2

6

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

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

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

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

更新:

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

这是答案:

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

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

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

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

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

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

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

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

于 2009-06-03T22:48:51.487 回答
0

一个鲜为人知的事实是,Windows Workflow Foundation 及其规则引擎的设计器可以托管在独立于 Visual Studio 的 Windows 窗体应用程序中。以这种方式创建的规则可以类似地独立于实际工作流进行评估。

请参阅WF 方案指南:工作流设计器重新托管教程:托管 WF 设计器

于 2009-07-12T02:21:43.133 回答