C#学习教程:如何在不编译的情况下从现有的LambdaExpression构建LambdaExpression这是我编译它们时的样子:;这显然不是从提供的参数中获取目标表达式的最快方法。此外,它使它与不支持C#方法调用的查询提供程序(如LINQtoSQL)不兼容。据我所知,最好的方法似乎是构建一个ExpressionVisitor类。但是,这似乎是一项非常常见的任务。有谁知道提供此功能的现有开源代码库?如果不是,那么接近ExpressionVisitor以使其尽可能通用的最佳方法是什么?我不知道这是否是最好的方法,但你可以这样做:返回表达式.Lambda>(Expression.Invoke(memberPredicateExpression,Expression.Invoke(getMemberExpression,x)),x);}用法:varexpr=CreatePredicate((Foof)=>f.Bar,bar=>bar%2==0);结果:x=>Invoke(bar=>((bar%2)==0),Invoke(f=>f.Bar,x))我想得到类似x=>x.Bar%的东西会更好2==0,但它可能更难......编辑:实际上,表达式访问者并不那么难:}类CombineExpressionVisitor:ExpressionVisitor{privatereadonlyParameterExpression_parameterToReplace;私人只读快递离子_replacementExpression;privateCombineExpressionVisitor(ParameterExpressionparameterToReplace,ExpressionreplacementExpression){_parameterToReplace=parameterToReplace;_replacementExpression=替换表达式;}publicstaticExpression>Combine(Expression>memberSelector,Expression>resultSelector){varvisitor=newCombineExpressionVisitor(resultSelector.Parameters[0],memberSelector.Body);returnExpression.Lambda>(visitor.Visit(resultSelector.Body),memberSelector.Parameters);}protectedoverrideExpressionVisitParameter(ParameterExpressionparameter){if(parameter==_parameterToReplace)return_replacementExpressionbase(VParameterExpressionbase;parameter);它给出了以下表达式:以上是C#学习教程:HowtobuildaLambdaExpressionfromanexistingLambdaExpressionwithoutcompiling。C#学习教程,希望大家多多关注——f=>((f.Bar%2)==0)本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
