/// <summary> /// LambdaExpression visit method /// </summary> /// <param name="lambda">The LambdaExpression to visit</param> /// <returns>The visited LambdaExpression</returns> internal virtual Expression VisitLambda(LambdaExpression lambda) { Expression body = this.Visit(lambda.Body); if (body != lambda.Body) { #if !ASTORIA_LIGHT return(Expression.Lambda(lambda.Type, body, lambda.Parameters)); #else ParameterExpression[] parameters = new ParameterExpression[lambda.Parameters.Count]; lambda.Parameters.CopyTo(parameters, 0); return(ExpressionHelpers.CreateLambda(lambda.Type, body, parameters)); #endif } return(lambda); }
/// <summary>Gets a delegate that can be invoked to add an item to a collection of the specified type.</summary> /// <param name='listType'>Type of list to use.</param> /// <returns>The delegate to invoke.</returns> internal static Action <object, object> GetAddToCollectionDelegate(Type listType) { Debug.Assert(listType != null, "listType != null"); Type listElementType; MethodInfo addMethod = ClientTypeUtil.GetAddToCollectionMethod(listType, out listElementType); ParameterExpression list = Expression.Parameter(typeof(object), "list"); ParameterExpression item = Expression.Parameter(typeof(object), "element"); Expression body = Expression.Call(Expression.Convert(list, listType), addMethod, Expression.Convert(item, listElementType)); #if ASTORIA_LIGHT LambdaExpression lambda = ExpressionHelpers.CreateLambda(body, list, item); #else LambdaExpression lambda = Expression.Lambda(body, list, item); #endif return((Action <object, object>)lambda.Compile()); }