我正在使用Expression以编程方式创建动态查询。
Expression.Subtract(exp1, exp2);
在一个要求中,我需要使用表达式的绝对值。像 -
这样的东西Math.Abs(Expression.Subtract(exp1, exp2));
但我收到的错误 -
System.Math.Abs(decimal)'的最佳重载方法匹配 一些无效的论点
答案 0 :(得分:3)
您不想在表达式上致电Math.Abs()
。您希望使用Math.Abs()
表达式的结果创建表示到Subtract
的调用的表达式。
所以首先你需要找到Math.Abs()
的正确重载,一个采用你的减法表达式返回的类型的参数:
var sub = Expression.Subtract(exp1, exp2);
MethodInfo abs = typeof(Math).GetMethod("Abs", new[]{sub.Type});
if (abs == null)
// error handling here: no matching method found
sub.Type
是减法表达式的返回类型。
然后你可以创建一个调用表达式:
var call = Expression.Call(null, abs, sub);
答案 1 :(得分:2)
您想在Math.Abs
上致电x - y
,而不是Expression
。由于类型Abs
中的方法Math
为static
,您不需要实例来调用它,这就是CallExpression
的第一个参数为空的原因。
这样做:
var subtractExp = Expression.Subtract(exp1, exp2);
var m = typeof(Math).GetMethod("Abs", new[] { subtractExp.Type });
var exp = Expression.Call(null, m, subtractExp);