首页 > 解决方案 > 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 之间没有转换”的错误。

如何将多个方法调用与表达式树结合起来?

标签: c#linq.net-coreexpression-trees

解决方案


我找到了解决方案。我有两个问题:

  1. 参数顺序错误。应该Expression.Call(property, method, listPropExpression);改为Expression.Call(listPropExpression, method, property);

  2. 主要问题通过简单的演员表解决:

    谓词=谓词!=空?(表达式) Expression.Or(predicate, containsExpression) : containsExpression;

结果我得到了像product=>product.LstProp.Contains("val1") Or product.LstProp.Contains("val2")


推荐阅读