gpt4 book ai didi

c# - DSL:从 DSL 规则到 C# 表达式

转载 作者:太空宇宙 更新时间:2023-11-03 20:45:44 32 4
gpt4 key购买 nike

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

  • 是否存在设计器( 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 语言,我会很高兴。我的意思是,如果用户可以检查代码(示例中的 “DSL 输出”),我们就不需要设计器了。

更新 #2

基于tipp,我盯着表情树。几天后,我遇到了 DLinq - 我从来都不是 DLinq 的忠实粉丝,但在这种情况下非常适合问题领域。

  • 易于将 (A > 2 AND B < 4) OR C = 5 解析为表达式树
  • 很容易创建这样的表达式
  • 非常容易序列化/反序列化
  • 基于 FlowLayoutPanel 的 GUI 作为“表达式构建器”工作得很好

最佳答案

您可以自己构建这样的东西。

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

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

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

更新:

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

答案如下:

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

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

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

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

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

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

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

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

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

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com