【问题标题】:How to create an UnaryExpression on Math functions as Log, Cos, Sin如何在 Log、Cos、Sin 等数学函数上创建 UnaryExpression
【发布时间】:2013-03-21 22:13:09
【问题描述】:

我想构建一个 UnaryExpression 列表,以便稍后在我的代码中使用。我能够轻松地将其用于 BinaryExpression 并获得:

var binaryList = new Func<Expression, Expression, Expression>[]
        {
            Expression.Add, 
            Expression.Subtract, 
            Expression.Multiply, 
            Expression.Divide
        };

在我的 UnaryExpression 列表中,我希望能够将 Math.Cos(..)、Math.Log(..) 处理为一元运算符。为了得到这个想法,我很想拥有类似的东西

var unaryList = new Func<Expression, Expression>[]
        {
            Expression.Negate, // works fine
            new Func<Expression, Expression>(
                expr => new UnaryExpression(Math.Cos, expr)
        };

有什么建议吗? 提前致谢。

【问题讨论】:

  • 你看过 Expression.Call 方法吗?
  • 是的,但我无法检索到 Math.Cos 的 MethodInfo。

标签: c# linq lambda expression


【解决方案1】:

您想为表示调用具有给定参数的静态方法的表达式创建一个工厂。调用方法由MethodCallExpression 表示,可以通过工厂方法Expression.Call 轻松创建其实例。方法如下:

var unary = new Func<Expression, Expression>(
    e => Expression.Call(null, typeof(Math).GetMethod("Cos"), e));

更新:我刚刚意识到Expression.Call 中的another overload 允许您在处理static 方法时完全省略第一个参数(实例):

e => Expression.Call(typeof(Math).GetMethod("Cos"), e)

【讨论】:

  • 完美,而且速度如此之快。非常感谢。
【解决方案2】:

我个人更喜欢 nameof 函数而不是使用魔法字符串:

e => Expression.Call(typeof(Math).GetMethod(nameof(Math.Cos)), e)

【讨论】:

    猜你喜欢
    • 2015-04-05
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    相关资源
    最近更新 更多