为了账号安全,请及时绑定邮箱和手机立即绑定

动态构建表达式以调用 Expression.GreaterThan()

动态构建表达式以调用 Expression.GreaterThan()

C#
米脂 2021-11-14 10:52:03
我试图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 函数。在这里,方法名称将指一些根据表达式方法与数字(或字符串)进行比较的方法。
查看完整描述

2 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

究竟什么是动态?操作值(即“一”和“二”的类型)?或者操作的类型(“GreaterThan”、“LessThen”)?

如果是前者,您不需要做任何事情,因为表达式生成器会处理它。

Expression.GreaterThan(Expression.Constant(1), Expression.Constant(2));

Expression.GreaterThan(Expression.Constant("Some"), Expression.Constant("text"));

将自动选择整数和字符串的正确大于运算符。

如果是你想要的后者,即动态选择操作,你需要写

var expr = method.Invoke(null, new object[] { one, two });

这意味着您需要调用表达式方法来获取 GreaterThan 表达式,从而产生与您编写Expression.GreaterThan(one, two).

调用Expression.Call表达式方法类似于创建表达式来创建表达式。


查看完整回答
反对 回复 2021-11-14
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

我认为您应该避免在此处使用反射并使用switch来构建它。使用这种方法可以获得强类型的所有好处。以https://www.codeproject.com/Articles/1079028/Build-Lambda-Expressions-Dynamically为例。


查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 270 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信