/// <summary> /// Compile the single item if it is possible to compile. /// It concerns those <see cref="ExpressionPart"/>s items which returns expression in <seealso cref="ExpressionPart.GetExpression(EvaluationContext, string, ref ExpressionData)"/>. /// </summary> /// <param name="context">The context of evaluation.</param> /// <param name="expressionTree">The expression tree.</param> protected virtual bool CompileSingleItem(EvaluationContext context, IList <ProcessedItem> expressionTree) { // compile single item return(ReverseLoop(expressionTree, i => { ProcessedItem item = expressionTree[i]; if (item.ItemType != null) { IExpressionPart obj = GetObject(item.ItemType); ExpressionData data = new ExpressionData(); Expression compiled = obj.GetExpression(context, item.Content, ref data); if (compiled != null) { ProcessedItem newItem = ProcessedItem.Create(compiled); expressionTree.RemoveAt(i); expressionTree.Insert(i, newItem); return true; } else if (data.TypeToCast != null) { ProcessedItem newItem = ProcessedItem.CreateCast(data.TypeToCast); expressionTree.RemoveAt(i); expressionTree.Insert(i, newItem); return true; } } return false; })); }
public static Expression <Func <T, TResult> > GetExpression <T, TResult>(this IExpressionPart filterPart, IDictionary <string, ParameterExpression> parameters, string parameterName) => (Expression <Func <T, TResult> >)filterPart.GetExpression ( typeof(T), typeof(TResult), parameters, parameterName );