修改表达式树

通过重载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);
		}			 
	}
}
原文地址:https://www.cnblogs.com/goodlucklzq/p/4758597.html