【问题标题】:Calculating expression tree with many parameters计算具有许多参数的表达式树
【发布时间】:2009-09-13 10:22:25
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我之前完全做过这个,使用数组方法(对于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&lt;int[],int&gt; 或类似类型,无论参数数量如何。而且类型化的InvokeDynamicInvoke 快得多。

    如果这些值的类型不同 - 这也是可行的;告诉我,我会添加一个示例。

    【讨论】:

    • 这是一种享受,谢谢 Marc。您能否发布一个类型不同时的示例,因为我可以预见这是下一个要求......而且我也很想知道它是如何完成的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    相关资源
    最近更新 更多