3

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

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

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

  1. 创建一大堆委托,例如Func<bool, bool, bool...>可以采用我认为用户可能需要的尽可能多的参数的委托。这感觉不是最优雅的解决方案,但我认为它会起作用,直到有人想要使用比我满足的更多的参数。
  2. 传入一个值数组,并使用数组索引器以某种方式将它们分配给我的参数。我已经考虑过这一点,但无法弄清楚它是如何工作的。

注意:它需要很快,所以没有拳击或类似的东西。

4

1 回答 1

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是多少。并且 typed 比DynamicInvoke.

如果这些值不都是相同的类型 - 这也是可行的;让我知道,我会添加一个例子。

于 2009-09-13T13:03:35.950 回答