编程语言
首页 > 编程语言> > c#-计算具有很多参数的表达式树

c#-计算具有很多参数的表达式树

作者:互联网

我正在尝试使用.Net 3.5中的表达式树和Lamdba表达式对象,以允许我动态计算用户输入的布尔表达式.

到目前为止,用户可以创建由BinarayExpressions组成的表达式树,其AND和OR值表示为ParameterExpressions.然后,我计划基于该树创建LambdaExpression,以便可以将表达式编译成一个我可以调用的委托.我遇到的问题是,我不知道用户将需要多少个输入参数,因此当我将表达式编译成委托时,我不知道该方法在运行时应该是什么方法.

到目前为止,我已经提出了两种可能的解决方案.

>创建一大堆代表
像Func布尔,布尔,布尔…可以
采取我认为用户可能需要的尽可能多的参数.这似乎不是最优雅的解决方案,但我认为它会奏效,除非有人想使用一个比我所需要的参数更多的参数.
>传递一个值数组,并使用数组索引器将它们以某种方式分配给我的参数.我已经考虑过了,但是无法确定它是如何工作的.

注意:它需要很快,所以不要装拳或类似的东西.

解决方法:

我之前使用数组方法(对于Finguistics,确实如此)做到了这一点.诀窍是Expression.ArrayIndex:

    var arr = Expression.Parameter(typeof(int[]), "arr");
    var body = Expression.ArrayIndex(arr, Expression.Constant(1));
    var expr = Expression.Lambda<Func<int[], int>>(body, arr);
    var func = expr.Compile();

    int[] vals = { 7, 8, 9 };
    int i = func(vals);

数组方法的优点是,无论参数有多少,您都可以保留强类型的委托类型(Func< int [],int>或类似类型).并且,类型化的Invoke比DynamicInvoke快得多.

如果这些值的类型不全相同-也可以;让我知道,我将举一个例子.

标签:delegates,c,net,lambda,expression-trees
来源: https://codeday.me/bug/20191210/2102108.html