如何在数学函数上创建对数,余弦,正弦的UnaryExpression

Ask*_*ein 2 c# linq lambda expression

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

var binaryList = new Func<Expression, Expression, Expression>[]
        {
            Expression.Add, 
            Expression.Subtract, 
            Expression.Multiply, 
            Expression.Divide
        };
Run Code Online (Sandbox Code Playgroud)

在我的UnaryExpression列表中,我希望能够作为Unary运算符处理Math.Cos(..),Math.Log(..)。为了得到这个主意,我希望有这样的东西

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

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

Jon*_*Jon 5

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

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

更新:我刚刚意识到还有另一个重载Expression.Call它允许您在处理static方法时完全省略第一个参数(实例):

e => Expression.Call(typeof(Math).GetMethod("Cos"), e)
Run Code Online (Sandbox Code Playgroud)