动态表达式 API (Dynamic.cs) 无法正确解析 .net 3.5 中的表达式

发布于 2024-09-09 03:53:16 字数 993 浏览 2 评论 0原文

我无法让这个 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 中运行的代码吗?

I'm having trouble getting this API working in .net 3.5 (works fine in 4.0). Basically I have following code

  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);

When running this code I get ArgumentException. The reason being .NET 3.5 does not have Func delegate which takes more than 4 parameters. Can someone suggest me change in Dynamic.cs so that I can get able code working in 3.5?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

随波逐流 2024-09-16 03:53:16

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

        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);

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

Yes thats one alternative. Here is the code that worked for me

        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);

But surely there should be better way of achieving my original implementation.

梦幻的味道 2024-09-16 03:53:16

是否有原因无法将所有双精度值组合成一个包含值的字段或属性的参数对象?那么表达式中的 Func 中只需要一个参数。

Is there a reason that you can't combine all the doubles into a single parameter object that contains fields or properties for the values? Then you'd only need one parameter in your Func for the expression.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文