c# - C# 表达式树 - 组合多个方法调用
问题描述
我正在使用 .Net Core 和表达式树。
我有一个 Product 类,其中 LstProp 属性包含由 ';' 分隔的值列表,例如“val1;val2;val3;”:
public class Product
{
// actually contains list of values separated by ';'
public string LstProp{get; set;}
}
我想通过这个属性过滤产品并包含使用表达式树的任何条件。我试过这个,但它不起作用。
var value="val1;val2"
var productItem = Expression.Parameter(typeof(Product), "product");
var prop = Expression.Property(productItem, "LstProp");
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var values = value.ToString().Split(';');
Expression predicate = null;
foreach (var val in values)
{
var listPropExpression = Expression.Constant(val);
var containsExpresion=Expression.Call(listPropExpression, method, property);
predicate = predicate != null ? Expression.Or(predicate, containsExpresion) : containsExpresion;
}
因此,我尝试为列表中的每个值组合包含函数的调用,但收到有关“BinaryExpression 和 MethodCallExpression 之间没有转换”的错误。
如何将多个方法调用与表达式树结合起来?
解决方案
我找到了解决方案。我有两个问题:
参数顺序错误。应该
Expression.Call(property, method, listPropExpression);
改为Expression.Call(listPropExpression, method, property);
主要问题通过简单的演员表解决:
谓词=谓词!=空?(表达式) Expression.Or(predicate, containsExpression) : containsExpression;
结果我得到了像product=>product.LstProp.Contains("val1") Or product.LstProp.Contains("val2")
推荐阅读
- c# - 你如何虚拟地执行鼠标移动和点击 [user32.dll]
- react-native - 如何在 React Native 中使用 Animated API 同时隐藏 Header 和 Footer
- python - Numpy.Matmul 和 Numpy.Dot:使用 Numpy 内置函数加速代码
- python - Python:检查区间数所在的最快方法
- r - 将 stat_density_2d 输出裁剪为多边形
- parameters - 如何在 Less mixins 中只更改一个参数?
- javascript - vuejs - 引导选择选项不起作用
- flutter - 如何使用颤振访问用户的日历设备
- c# - 可靠地修复 JSON 中损坏的转义序列
- javascript - 如何通过输入字段更改滑块?