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" 的错误。
如何将多个方法调用与表达式树结合起来?
我找到了解决办法。
我有两个问题:
参数顺序不正确。
应该是 Expression.Call(property, method, listPropExpression);
而不是 Expression.Call(listPropExpression, method, property);
主要问题已通过简单转换解决:
predicate = predicate != null ? (表达式)Expression.Or(谓词,包含表达式):包含表达式;
结果我得到像product=>product.LstProp.Contains("val1") Or product.LstProp.Contains("val2")
这样的表达式
我正在使用 .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" 的错误。
如何将多个方法调用与表达式树结合起来?
我找到了解决办法。 我有两个问题:
参数顺序不正确。 应该是
Expression.Call(property, method, listPropExpression);
而不是Expression.Call(listPropExpression, method, property);
主要问题已通过简单转换解决:
predicate = predicate != null ? (表达式)Expression.Or(谓词,包含表达式):包含表达式;
结果我得到像product=>product.LstProp.Contains("val1") Or product.LstProp.Contains("val2")