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
?