private static LambdaExpression GetExpression(IQueryable source, Func <dynamic, dynamic> expressionBuilder) { ParameterExpression parameterExpression = Expression.Parameter(GetElementType(source), expressionBuilder.Method.GetParameters()[0].Name); DynamicExpressionBuilder dynamicExpression = expressionBuilder(new DynamicExpressionBuilder(parameterExpression)); Expression body = dynamicExpression.Expression; return(Expression.Lambda(body, parameterExpression)); }
public override bool TryUnaryOperation(UnaryOperationBinder binder, out object result) { if (binder.Operation == ExpressionType.IsFalse || binder.Operation == ExpressionType.IsTrue) { result = false; return(true); } result = new DynamicExpressionBuilder(Expression.MakeUnary(binder.Operation, Expression, binder.ReturnType)); return(true); }
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { // TODO: As a first attempt we can use the member names of the parameters to try and resolve the overload MethodInfo methodInfo = null; if (args.Any(a => a == null)) { methodInfo = Expression.Type.GetMethod(binder.Name); } else { var types = args.Select(arg => arg.GetType()).ToArray(); methodInfo = Expression.Type.GetMethod(binder.Name, types); } if (methodInfo != null) { var expression = Expression.Call(Expression, methodInfo, args.Select(Expression.Constant)); result = new DynamicExpressionBuilder(expression); return(true); } return(base.TryInvokeMember(binder, args, out result)); }
public override bool TryGetMember(GetMemberBinder binder, out object result) { result = new DynamicExpressionBuilder(Expression.Property(Expression, binder.Name)); return(true); }