我有一些公共用户定义的类,它们的成员之间有关系,还有几个具有特定和通用签名的方法。
我希望能够使用if / then / else,foreach,do / while,variable assignment等基本控制语句来存储和操作这些类(以及CLR类)的自定义控制流。
应在运行时创建自定义控制流,然后存储以供以后使用和操作。 我们的想法是使用强类型语法来控制流的数据表示,可能采用抽象语法树的形式,以便能够应用遗传操作。 生成的自定义代码必须作为另一个程序的一部分执行。
1)操作遗传操作然后执行包含我的类的代码的首选代码表示是什么
2)我应该使用哪些c#技术来解决上述问题? 我知道有相关的技术,如反射,新的c#3.0功能(lambda,表达式树),CodeDom,DLR库等,但哪种方法或组合是最有效的。
3)是否有这样的范例或实现?
编辑: 该平台提供了定义的c#自定义类型的数据,包括常量和时间变量。
规则应用于数据(基本条件或更复杂的功能),并决定采取一些行动。
我希望能够:
在树或图表上表示规则并执行流程。
用户通过UI工具包创建自定义规则集
在树或图表上重新排列并应用GP操作
答案 0 :(得分:2)
反射是检查已经生成的类型,方法,字段等的技术,因此它现在可能对你没什么帮助。
表达式树很有趣,但是AFAIK它们不允许你创建复杂的程序流,因为lambda表达式不能有一个主体,这会使创建任何中等复杂的东西变得相当困难。
DLR正在制定中。你会得到一些零碎的东西,但只有下一个.NET版本才能获得DLR的支持。这可能是一个有趣的选择,通过动态创建程序并执行它们。
您现在可以做的是在动态方法或动态生成的程序集中发出IL。应该可以使用所有可能的构造,但后续操作可能相当困难。
即便如此,有一个项目可以做很多IL魔法,它甚至可能对你有用:LinFu。根据列表,您有动态对象的实现,可以执行诸如dynamicObject.CreateDuck< InterfaceType>()
之类的操作。WF(工作流基础)框架可能有点重,但也很有趣。这样的工作流程应该可以通过程序构建,并且由于它们的延续风格,它们可能很有趣:您可以随时保持正在运行的工作流程,并在您离开它的地方捡起它。
在WF内,您可以使用所有传统的程序结构。
答案 1 :(得分:1)
以C#等语言表示的育种程序非常棘手 - 它们的设计并不具有可塑性 - 您会发现您所做的绝大多数更改只会导致程序失败。
我会推荐两种替代方法中的一种:
(1)可以使用线性序列的指令和某种形式的虚拟寄存器或堆栈机器来表示。 (2)可以使用树来表示,并使用某种形式的“reduce”算法进行评估。
无论使用何种方法,您都需要在沙箱中执行程序 - 无限循环将是常见的,因此您需要能够在一定数量的循环后停止它们。
答案 2 :(得分:1)
the Dynamic Expression [example] API涵盖了这个空间......
答案 3 :(得分:1)
只需输出c#(支持此功能的任何其他.net语言,f#也能很好地工作)并使用CodeDomProvider即时编译它。强制提供的代码是一个源文件,包括一个实现IDynamicEntryPoint的类型(使用静态方法或空构造函数,这是一个入口点,将在构造后调用)
这应该是您开始使用的第一个停靠点,因为它可以在同一时间快速尝试以获得最高性能的最佳机会(除非动态IL输出,但即便如此,您也可能无法击败编译器) )
这显然有两个可能的缺陷,可能是交易破坏者:
除非您有兴趣编写自己的语言/解析器/编译器,否则请使用已经存在的语言/解析器/编译器。