protected override Expression VisitMethodCall(MethodCallExpression node) { if (node == null) { throw new ArgumentNullException(nameof(node)); } if (node.Object != null && node.Object.NodeType == ExpressionType.MemberAccess && ((MemberExpression)node.Object).RootExpressionType() == ExpressionType.Parameter) { string format; if (node.Method.Name == "StartsWith" || node.Method.Name == "Contains" || node.Method.Name == "EndsWith") { format = "({0} LIKE {1})"; } else if (node.Method.Name == "IgnoreExpression") { return(node); } else { throw new NotSupportedException($"不受支持的方法调用 {node.Method.Name}"); } // 解析的时候需要在其他方法内根据方法名拼接字符串, // 所以在这里需要一个全局变量保存方法名 _tempMethod = node.Method.Name; Visit(node.Object); Visit(node.Arguments[0]); var right = _stringStack.Pop(); var left = _stringStack.Pop(); _stringStack.Push(string.Format(format, left, right)); } else if (node.Method.Name == "DefaultTrue") { _stringStack.Push("1=1"); } else if (node.Method.Name == "DefaultFalse") { _stringStack.Push("1=0"); } else { var obj = ResolveValue(node.GetValue()); var parameterName = $"{_prefix}__p_{_parameterIndex++}"; _parameters.Add(new KeyValuePair <string, object>(parameterName, obj)); _stringStack.Push($" {parameterName} "); } return(node); }
protected override Expression VisitMethodCall(MethodCallExpression node) { if (node.InvolvesParameter()) { HandleParameter(node); } else { _sb.Append("@" + Parameters.CurrentIndex); Parameters.RegisterParameter(node.GetValue()); } return(node); }
private string ResolveCallClause(MethodCallExpression node) { var obj = node.Object; if (obj != null && obj.NodeType == ExpressionType.MemberAccess) { var expression = (MemberExpression)obj; var rootNodeType = expression.GetRootType(out var stack); if (rootNodeType == ExpressionType.Parameter) { return(ResolveParameterMemberMethodCall(node, stack)); } } var value = (bool)node.GetValue(); return(value ? "1=1" : "1<>1"); }
/// <summary> /// Get the value from an expression. /// </summary> /// <param name="expression">The expression to be evaluated.</param> /// <returns>the value.</returns> public static object GetValue(this Expression expression, JsonSerializerSettings jsonSerializerSettings) { if (expression == null) { throw new ArgumentNullException(nameof(expression)); } switch (expression.NodeType) { case ExpressionType.Constant: { ConstantExpression constantExpression = expression as ConstantExpression; if (constantExpression == null) { throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(ConstantExpression)}\r\n\t{expression}", nameof(expression)); } return(constantExpression.GetValue()); } case ExpressionType.Call: { MethodCallExpression methodCallExpression = expression as MethodCallExpression; if (methodCallExpression == null) { throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(MethodCallExpression)}\r\n\t{expression}", nameof(expression)); } return(methodCallExpression.GetValue(jsonSerializerSettings)); } case ExpressionType.Convert: { UnaryExpression unaryExpression = expression as UnaryExpression; if (unaryExpression == null) { throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(UnaryExpression)}\r\n\t{expression}", nameof(expression)); } return(unaryExpression.GetValue(jsonSerializerSettings)); } case ExpressionType.MemberAccess: { MemberExpression memberExpression = expression as MemberExpression; if (memberExpression == null) { throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(MemberExpression)}\r\n\t{expression}", nameof(expression)); } return(memberExpression.GetValue(jsonSerializerSettings)); } case ExpressionType.New: { NewExpression newExpression = expression as NewExpression; if (newExpression == null) { throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(NewExpression)}\r\n\t{expression}", nameof(expression)); } return(newExpression.GetValue(jsonSerializerSettings)); } case ExpressionType.Not: { UnaryExpression unaryExpression = expression as UnaryExpression; if (unaryExpression == null) { throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(UnaryExpression)}\r\n\t{expression}", nameof(expression)); } object unaryValue = unaryExpression.GetValue(jsonSerializerSettings); if (unaryValue == null || (unaryValue.GetType() != typeof(bool) && unaryValue.GetType() != typeof(bool?))) { throw new ArgumentException($"Invalid type", nameof(expression)); } return(!((bool)unaryValue)); } case ExpressionType.Parameter: { ParameterExpression parameterExpression = expression as ParameterExpression; if (parameterExpression == null) { throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(ParameterExpression)}\r\n\t{expression}", nameof(expression)); } throw new ArgumentException($"Invalid expression type {expression.NodeType}\r\n\t{expression}", nameof(expression)); } case ExpressionType.NewArrayInit: { NewArrayExpression newArrayExpression = expression as NewArrayExpression; if (newArrayExpression == null) { throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(NewArrayExpression)}\r\n\t{expression}", nameof(expression)); } return(newArrayExpression.Expressions.Select(_ => _.GetValue(jsonSerializerSettings)).ToArray()); } default: throw new ArgumentException($"Invalid expression type {expression.NodeType}\r\n\t{expression}", nameof(expression)); } }
public static object GetValue(this Expression expression) { if (expression == null) { throw new ArgumentNullException(nameof(expression)); } switch (expression.NodeType) { case ExpressionType.Constant: { ConstantExpression constantExpression = expression as ConstantExpression; if (constantExpression == null) { throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(ConstantExpression)}\r\n\t{expression}", nameof(expression)); } return(constantExpression.GetValue()); } case ExpressionType.Call: { MethodCallExpression methodCallExpression = expression as MethodCallExpression; if (methodCallExpression == null) { throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(MethodCallExpression)}\r\n\t{expression}", nameof(expression)); } return(methodCallExpression.GetValue()); } case ExpressionType.Convert: { UnaryExpression unaryExpression = expression as UnaryExpression; if (unaryExpression == null) { throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(UnaryExpression)}\r\n\t{expression}", nameof(expression)); } return(unaryExpression.GetValue()); } case ExpressionType.MemberAccess: { MemberExpression memberExpression = expression as MemberExpression; if (memberExpression == null) { throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(MemberExpression)}\r\n\t{expression}", nameof(expression)); } return(memberExpression.GetValue()); } case ExpressionType.New: { NewExpression newExpression = expression as NewExpression; if (newExpression == null) { throw new ArgumentException($"Expected {nameof(expression)} to be of type {nameof(NewExpression)}\r\n\t{expression}", nameof(expression)); } return(newExpression.GetValue()); } default: throw new ArgumentException($"Invalid expression type {expression.NodeType}\r\n\t{expression}", nameof(expression)); } }