C# 在Linq.Expressions.Expression中使用Math.Abs-动态查询创建

C# 在Linq.Expressions.Expression中使用Math.Abs-动态查询创建,c#,linq,expression,C#,Linq,Expression,我使用表达式以编程方式创建动态查询 Expression.Subtract(exp1, exp2); 在一个需求中,我需要使用表达式的绝对值。类似于- Math.Abs(Expression.Subtract(exp1, exp2)); 但我在这件事上犯了错误- 与System.Math.Abs(decimal)”匹配的最佳重载方法 一些无效的参数 您想在x-y上调用Math.Abs,而不是在表达式上调用。由于类型Math中的方法Abs是static,因此不需要实例来调用它,这就是CallE

我使用表达式以编程方式创建动态查询

Expression.Subtract(exp1, exp2);
在一个需求中,我需要使用表达式的绝对值。类似于-

Math.Abs(Expression.Subtract(exp1, exp2));
但我在这件事上犯了错误-

与System.Math.Abs(decimal)”匹配的最佳重载方法 一些无效的参数


您想在
x-y
上调用
Math.Abs
,而不是在
表达式上调用。由于类型
Math
中的方法
Abs
static
,因此不需要实例来调用它,这就是
CallExpression
的第一个参数为null的原因

这样做:

var subtractExp = Expression.Subtract(exp1, exp2);
var m = typeof(Math).GetMethod("Abs", new[] { subtractExp.Type });
var exp = Expression.Call(null, m, subtractExp);

您不想对表达式调用
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
var call = Expression.Call(null, abs, sub);
sub.Type
是减法表达式的返回类型

然后可以创建调用表达式:

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
var call = Expression.Call(null, abs, sub);

你肯定想要一个
表达式。调用
,而不是
表达式的绝对值
。我肯定你需要告诉
GetMethod(“Abs”)
参数类型,否则你会得到一个
模糊匹配异常
。那么,现在减法的结果是
int