private object ParseFilterValue(string propertyTypeName, ListFilterValue filterValue, Type propertyType) { if (propertyTypeName == "DateTime") { return(DateTime.Parse(filterValue.Term)); } else if (propertyTypeName == "DateTimeOffset") { return(DateTimeOffset.Parse(filterValue.Term)); } else if (propertyTypeName == "Int32") { return(Convert.ToInt32(filterValue.Term)); } else if (propertyTypeName == "Decimal") { return(Convert.ToDecimal(filterValue.Term)); } else if (propertyTypeName == "Double") { return(Convert.ToDouble(filterValue.Term)); } else if (propertyTypeName == "Boolean") { return(Convert.ToBoolean(filterValue.Term)); } else if (propertyType.IsEnum) { return((int)Enum.Parse(propertyType, filterValue?.Term).To(propertyType)); } // strings not converted return(filterValue.Term); }
// used in ModelBinder public static ListFilter Parse(string name, string expression) { var result = new ListFilter { Name = name }; var value = new ListFilterValue(); var escape = false; var negate = false; foreach (var c in expression) { if (escape) { value.Term += c.ToString(); escape = false; } else if (c == '\\') { escape = true; } else if (c == '!' && value.Term == "") { value.Operator = ListFilterOperator.NotEqual; negate = true; } else if (c == '>' && value.Term == "") { value.Operator = negate ? ListFilterOperator.LessThanOrEqual : ListFilterOperator.GreaterThan; } else if (c == '<' && value.Term == "") { value.Operator = negate ? ListFilterOperator.GreaterThanOrEqual : ListFilterOperator.LessThan; } else if (c == '=' && value.Operator == ListFilterOperator.GreaterThan && value.Term == "") { value.Operator = ListFilterOperator.GreaterThanOrEqual; } else if (c == '=' && value.Operator == ListFilterOperator.LessThan && value.Term == "") { value.Operator = ListFilterOperator.LessThanOrEqual; } else if (c == '=' && value.Term == "") { value.Operator = ListFilterOperator.Equal; } else if (c == '*') { value.WildcardPositions.Add(value.Term.Length); } else if (c == '|') { result.Values.Add(value); value = new ListFilterValue(); negate = false; } else { value.Term += c.ToString(); } } result.QueryParams.Add(new Tuple <string, string>(name, expression)); result.Values.Add(value); return(result); }