【问题标题】:Dynamic Expression API (Dynamic.cs) Not properly parsing expression in .net 3.5动态表达式 API (Dynamic.cs) 无法正确解析 .net 3.5 中的表达式
【发布时间】:2010-07-08 15:38:57
【问题描述】:

我无法让这个 API 在 .net 3.5 中运行(在 4.0 中运行良好)。基本上我有以下代码

  List<ParameterExpression> parameters = new List<ParameterExpression>();
  parameters.Add(Expression.Parameter(typeof(double), "R0C6"));
  parameters.Add(Expression.Parameter(typeof(double), "R0C7"));
  parameters.Add(Expression.Parameter(typeof(double), "R0C8"));
  parameters.Add(Expression.Parameter(typeof(double), "R0C9"));
  parameters.Add(Expression.Parameter(typeof(double), "R0C10"));
  parameters.Add(Expression.Parameter(typeof(double), "R0C11"));
  parameters.Add(Expression.Parameter(typeof(double), "R0C12"));

  LambdaExpression e = DynamicExpressionBuilder.ParseLambda(
              parameters.ToArray(), typeof(double), "R0C6 + R0C7 + R0C8 + R0C9 + R0C10 + R0C11 + R0C12");

  var result = e.Compile().DynamicInvoke(1, 1, 1, 1, 1, 1, 1);
  Console.WriteLine(result);

运行此代码时,我得到 ArgumentException。原因是 .NET 3.5 没有具有 4 个以上参数的 Func 委托。有人可以建议我更改 Dynamic.cs 以便我可以在 3.5 中运行代码吗?

【问题讨论】:

  • 你能解释一下 DynamicExpressionBuilder 对参数做了什么吗?我在下面的回答假设您有一组静态参数,但在再次阅读后,我发现实际上您可能正在处理未知数量的参数。
  • DynamicExpressionBuilder 只是 Dynamic.cs 文件中类 DynamicExpression 的重命名版本。我刚刚更改了名称,以便可以区分 system.linq.expression 命名空间中的类 DynamicExpression。

标签: linq dynamic tree lambda expression


【解决方案1】:

是的,这是另一种选择。这是对我有用的代码

        List<ParameterExpression> parameters = new List<ParameterExpression>();
        parameters.Add(Expression.Parameter(typeof(Holder), "H"));


        LambdaExpression e = DynamicExpressionBuilder.ParseLambda(parameters.ToArray(), typeof(double), "H.R0C6 + H.R0C7 + H.R0C8 + H.R0C9 + H.R0C10 + H.R0C11 + H.R0C12");

        var result = e.Compile().DynamicInvoke(new Holder { R0C6 = 1, R0C7 = 1, R0C8 = 1, R0C9 = 1, R0C10 = 1, R0C11 = 1, R0C12 = 1 });
        Console.WriteLine(result);

但肯定应该有更好的方法来实现我的原始实现。

【讨论】:

    【解决方案2】:

    您是否有理由不能将所有双精度值组合成一个包含值的字段或属性的单个参数对象?那么你只需要在你的 Func 中为表达式提供一个参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-22
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多