C# 表达式树 - 组合多个方法调用

C# Expression trees - combine multiple method calls

我正在使用 .Net Core 和表达式树。

我有一个产品 class,其中 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;
 }

所以我尝试为列表中的每个值组合调用 Contains 函数,但收到关于 "No conversion between BinaryExpression and MethodCallExpression" 的错误。

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

我找到了解决办法。 我有两个问题:

  1. 参数顺序不正确。 应该是 Expression.Call(property, method, listPropExpression); 而不是 Expression.Call(listPropExpression, method, property);

  2. 主要问题已通过简单转换解决:

    predicate = predicate != null ? (表达式)Expression.Or(谓词,包含表达式):包含表达式;

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

这样的表达式