/// <summary> /// Visits the ConstantExpression. /// </summary> /// <param name="node"> /// The expression to visit. /// </param> /// <returns> /// The modified expression, if it or any subexpression was modified; otherwise, returns the original expression. /// </returns> protected override Expression VisitConstant(ConstantExpression node) { if (node.Type == typeof(GenericField)) { GenericField value = node.GetValue <GenericField>(); switch (value) { case GenericField.ActualType: sortField = new SortField(Documents.ObjectMappingExtensions.FieldActualType, SortFieldType.STRING, sortDescending); break; case GenericField.StaticType: sortField = new SortField(Documents.ObjectMappingExtensions.FieldStaticType, SortFieldType.STRING, sortDescending); break; case GenericField.Source: sortField = new SortField(Documents.ObjectMappingExtensions.FieldSource, SortFieldType.STRING, sortDescending); break; case GenericField.Timestamp: sortField = new SortField(Documents.ObjectMappingExtensions.FieldTimestamp, SortFieldType.INT64, sortDescending); break; default: Debug.Fail("Unsupported GenericField: " + value); throw new NotSupportedException(String.Format("Unsupported GenericField: {0}.", value)); } return(node); } return(base.VisitConstant(node)); }
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)); } }
/// <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)); } }
void HandleSingleBooleanConstant(ConstantExpression node) { var val = (bool)node.GetValue(); _sb.Append(val ? "1=1" : "1<1"); }