zoukankan      html  css  js  c++  java
  • 修改表达式树

    通过重载ExpressionVistior类中的方法可以实现修改表达式树的目的。

    正常情况下如果直接对两个lambda表达式进行组合使用,会报“变量未定义的”错误.此时就可以通过重写
    ExpressionVistior中的方法进行参数的替换,将连个lambda表达式中的参数进行统一。

    下面是一个修改lambda表达式参数的例子:

    namespace SpecificationPattern
    {
    	class Program
    	{
    		static void Main(string[] args)V
    		{
    			Expression<Func<int, bool>> lambda1 = a => a > 1;
    			Expression<Func<int, bool>> lambda2 = b => b <= 10;
    
    			ParameterExpression param = Expression.Parameter(typeof(int), "i");
    			ParameterReplacer2 paramReplace = new ParameterReplacer2(param);
    			Expression lambad3 = Expression.And(paramReplace.Replace(lambda1.Body), paramReplace.Replace(lambda2.Body));
    			
    			var lambda = Expression.Lambda<Func<int, bool>>(lambad3, param);
    			var aa= lambda.Compile();
    			
    			Console.ReadLine();
    		}
    	}
    	/// <summary>
    	/// 修改表达式的参数
    	/// </summary>
    	class ParameterReplacer2 : ExpressionVisitor
    	{
    		private ParameterExpression _parameterExpr;
    		public ParameterReplacer2(ParameterExpression paramExpr)
    		{
    			this._parameterExpr = paramExpr;
    		}
    		//重写,进行参数替换			
    		protected override Expression VisitParameter(ParameterExpression node)
    		{
    			return _parameterExpr;
    		}
    		public Expression Replace(Expression node)
    		{
    			return this.Visit(node);
    		}			 
    	}
    }
    
  • 相关阅读:
    CF1036C Solution
    CF1041E Solution
    CF1043E Solution
    CF1054D Solution
    CF1032D Solution
    题解 P6194 【[EER1]苏联人】
    题解 CF1324A 【Yet Another Tetris Problem】
    题解 CF1325A 【EhAb AnD gCd】
    题解 CF1325B 【CopyCopyCopyCopyCopy】
    题解 AT5805 【Bishop】
  • 原文地址:https://www.cnblogs.com/goodlucklzq/p/4758597.html
Copyright © 2011-2022 走看看