C# 动态构建表达式以调用expression.GreaterThan()

C# 动态构建表达式以调用expression.GreaterThan(),c#,expression,C#,Expression,我试图在运行时动态地选择Expression中的方法。例如,我希望实现与我在下面尝试的类似的目标: ConstantExpression one = Expression.Constant(1); ConstantExpression two = Expression.Constant(2); // Here the 'GreaterThan' is the method name received at runtime: var method = typeof(Expression).GetM

我试图在运行时动态地选择
Expression
中的方法。例如,我希望实现与我在下面尝试的类似的目标:

ConstantExpression one = Expression.Constant(1);
ConstantExpression two = Expression.Constant(2);
// Here the 'GreaterThan' is the method name received at runtime:
var method = typeof(Expression).GetMethods().Single(mi => mi.Name == "GreaterThan" && mi.GetParameters().Length == 2);
var expr = Expression.Call(method, one, two);
在最后一行,我得到了错误:

System.ArgumentException: 'Expression of type 'System.Int32' cannot be used for parameter of type 'System.Linq.Expressions.Expression' of method 'System.Linq.Expressions.BinaryExpression GreaterThan(System.Linq.Expressions.Expression, System.Linq.Expressions.Expression)''

我想做的是通过在运行时动态选择
Expression
中的方法来构建lambda函数。这里,方法名称将引用一些方法,这些方法根据表达式方法与数字(或字符串)进行比较。

什么是动态的?操作值(即“一”和“二”的类型)?或者操作的类型(“大于”、“小于”)

如果是前者,则不需要执行任何操作,因为表达式生成器会处理它

将自动选择整数和字符串的适当大于运算符

如果是后者,即动态选择操作,则需要编写

var expr = method.Invoke(null, new object[] { one, two });
这意味着您需要调用expression方法来获得GreaterThan表达式,从而产生与编写
expression.GreaterThan(一,二)
相同的结果


调用
表达式。对表达式方法调用
类似于创建表达式来创建表达式。

我认为您应该避免在此处使用反射,而是使用开关来构建它。使用这种方法可以获得强类型的所有好处。请看一个例子

Expression.GreaterThan(Expression.Constant("Some"), Expression.Constant("text"));
var expr = method.Invoke(null, new object[] { one, two });