Ric*_*end 14 .net c# linq generics lambda
如何使用OR将两个lambda表达式合并为一个?
我尝试了以下但是合并它们需要我将参数传递给Expression.Invoke调用,但是我想将传递给新lambda的值传递给每个child-lambda.
Expression<Func<int, bool>> func1 = (x) => x > 5;
Expression<Func<int, bool>> func2 = (x) => x < 0;
//Combines the lambdas but result in runtime error saying I need to pass in arguments
//However I want the argument passed into each child lambda to be whatever is passed into the new main lambda
Expression<Func<int, bool>> lambda = Expression.Lambda<Func<int, bool>>(Expression.Or(Expression.Invoke(func1), Expression.Invoke(func2)));
//The 9 should be passed into the new lambda and into both child lambdas
bool tst = lambda.Compile().Invoke(9);
Run Code Online (Sandbox Code Playgroud)
任何想法如何将两个lambda表达式合并为一个并具有子lambdas的参数是父的?
Mat*_*ott 18
我发现学习表达式的最好方法是查看PredicateBuilder的源代码.
如果要组合多个语句,可以:
Expression<Func<int, bool>> func1 = (x) => x > 5;
Expression<Func<int, bool>> func2 = (x) => x > 10;
var invocation = Expression.Invoke(func2, func1.Parameters.Cast<Expression>());
var expression = Expression.Lambda<Func<int, bool>>(Expression.OrElse(func1.Body, invocation), func1.Parameters);
Run Code Online (Sandbox Code Playgroud)
在Expression.Invoke
创建的参数适用于您的InvocationExpression func2
.
事实上,PredicateBuilder可能就是您需要的一切.
var predicate = PredicateBuilder.False<int>();
predicate = predicate.Or(x => x > 5);
predicate = predicate.Or(x => x > 10);
Run Code Online (Sandbox Code Playgroud)
我会修改" x > 5
或x > 10
",对OR来说似乎很奇怪.
希望有所帮助.
归档时间: |
|
查看次数: |
8148 次 |
最近记录: |