使用许多参数计算表达式树

时间:2009-09-13 10:22:26

标签: c# .net delegates lambda expression-trees

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

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

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

  1. 创建一大堆代表 像Func<bool, bool, bool...>那些可以 采用我认为用户可能需要的参数。这不是最优雅的解决方案,但我认为它会起作用,直到有人想要使用比我提供的更多参数。
  2. 传入一个值数组,并使用数组索引器以某种方式将它们分配给我的参数。我已经考虑过这个但是无法解决它是如何工作的。
  3. 注意:它需要快速,所以没有拳击或类似的东西。

1 个答案:

答案 0 :(得分:3)

之前我使用数组方法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比{{1}快得多}。

如果值不是全部相同的类型 - 那也是可行的;让我知道,我将添加一个例子。