2

我想构建一个 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)
        };

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

4

2 回答 2

5

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

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

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

e => Expression.Call(typeof(Math).GetMethod("Cos"), e)
于 2013-03-21T22:25:46.257 回答
0

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

e => Expression.Call(typeof(Math).GetMethod(nameof(Math.Cos)), e)
于 2019-11-12T08:25:21.207 回答