internal override Expression BuildExpression(Expression callerExpression = null) { var left = Left.BuildExpression(callerExpression); var right = Right.BuildExpression(callerExpression); return(Expression.MakeIndex(left, left.Type.GetProperty("Item", new[] { right.Type }), new [] { right })); }
internal override Expression BuildExpression(Expression callerExpression = null) { var rightType = Right.BuildExpression(callerExpression).Type; if (!rightType.IsNullable()) { rightType = rightType.MakeNullableType(); } return(Expression.TypeAs(Left.BuildExpression(callerExpression), rightType)); }
internal override Expression BuildExpression(Expression callerExpression = null) { var left = Left.BuildExpression(callerExpression); var right = Right.BuildExpression(callerExpression); if (left is ConstantExpression leftValue && leftValue.Value == null) { left = Expression.Convert(left, right.Type); } return(Expression.Coalesce(left, right)); }
internal override Expression BuildExpression(Expression callerExpression = null) { var left = Left.BuildExpression(callerExpression); var right = Right.BuildExpression(Left.BuildExpression(callerExpression)); if (!right.Type.IsNullable()) { right = Expression.Convert(right, right.Type.MakeNullableType()); } return(Expression.Condition(Expression.Equal(left, Expression.Constant(null, left.Type)), Expression.Constant(null, right.Type), right)); }
internal override Expression BuildExpression(Expression callerExpression = null) { if (callerExpression == null) { throw new ArgumentNullException(nameof(callerExpression)); } var parameterName = ((IdentifierNode)Left).Name; var parameterType = GetParameterType(); Debug.Assert(parameterType != null); var parameterExpression = Expression.Parameter(parameterType, parameterName); return(Expression.Lambda(Right.BuildExpression(parameterExpression), parameterExpression)); Type GetParameterType() { return(callerExpression.Type == typeof(string) ? typeof(char) : callerExpression.Type.IsArray?callerExpression.Type.GetElementType() : callerExpression.Type.GetGenericArguments()[0]); } }
internal override Expression BuildExpression(Expression callerExpression = null) { return(Expression.Divide(Left.BuildExpression(callerExpression), Right.BuildExpression(callerExpression))); }
internal override Expression BuildExpression(Expression callerExpression = null) { return(Expression.TypeIs(Left.BuildExpression(callerExpression), Right.BuildExpression(callerExpression).Type)); }
internal override Expression BuildExpression(Expression callerExpression = null) { return(Expression.LessThanOrEqual(Left.BuildExpression(callerExpression), Right.BuildExpression(callerExpression))); }