public Func<EntitySession, FullSetEntityCache, object[], object> Rewrite(LambdaExpression lambda) { _lambda = lambda; _sessionParam = Expression.Parameter(typeof(EntitySession), "@session"); _cacheParam = Expression.Parameter(typeof(FullSetEntityCache), "@entitycache"); _argsParam = Expression.Parameter(typeof(object[]), "@args"); var newParams = new ParameterExpression[] { _sessionParam, _cacheParam, _argsParam }; // Rewrite var newBody = Visit(lambda.Body); // we need a separate visiting loop to inject Cloning method var injector = new CloneCallInjector(); var finalBody = injector.InjectCloneMethod(_model, newBody, _sessionParam); var finalBodyToObj = Expression.Convert(finalBody, typeof(object)); //Wrap into lambda var newLambda = Expression.Lambda(finalBodyToObj, newParams); var compiled = newLambda.Compile(); var result = (Func<EntitySession, FullSetEntityCache, object[], object>)compiled; return result; }
public Func <EntitySession, FullSetEntityCache, object[], object> Rewrite(LambdaExpression lambda) { _lambda = lambda; _sessionParam = Expression.Parameter(typeof(EntitySession), "@session"); _cacheParam = Expression.Parameter(typeof(FullSetEntityCache), "@entitycache"); _argsParam = Expression.Parameter(typeof(object[]), "@args"); var newParams = new ParameterExpression[] { _sessionParam, _cacheParam, _argsParam }; // Rewrite var newBody = Visit(lambda.Body); // we need a separate visiting loop to inject Cloning method var injector = new CloneCallInjector(); var finalBody = injector.InjectCloneMethod(_model, newBody, _sessionParam); var finalBodyToObj = Expression.Convert(finalBody, typeof(object)); //Wrap into lambda var newLambda = Expression.Lambda(finalBodyToObj, newParams); var compiled = newLambda.Compile(); var result = (Func <EntitySession, FullSetEntityCache, object[], object>)compiled; return(result); }