private static Expression ChangeTypeHelper(Expression input, Type type) { if (type == typeof(string)) { return(input); } MethodInfo parse; if ((parse = type.GetMethod("Parse", new[] { typeof(string) }))?.ReturnType == type) { return(Expression.Call(parse, input)); } Expression convert; if (type.IsEnum) { var parser = EnumParseHelper.GetParser(type); convert = Expression.Invoke(parser, input); } else { parse = typeof(Convert).GetMethod(nameof(Convert.ChangeType), new[] { typeof(object), typeof(Type) }); convert = Expression.Call(parse, input, Expression.Constant(type)); } return(Expression.Convert(convert, type)); }
public static ObjectParserConfiguration CreateDefault() { return(CreateEmpty() .Configure <string>(ValueParser.CreateSimpleStringParser()) .Configure <int>(int.TryParse) .Configure <byte>(byte.TryParse) .Configure <sbyte>(sbyte.TryParse) .Configure <long>(long.TryParse) .Configure <short>(short.TryParse) .Configure((string value, out decimal result) => decimal.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out result)) .Configure((string value, out double result) => double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out result)) .Configure((string value, out float result) => float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out result)) .Configure <bool>(bool.TryParse) .Configure <Guid>(Guid.TryParse) .Configure <TimeUuid>(TimeUuidParseHelper.TryParse) .Configure <DateTime>(DateTimeParseHelper.TryParse) .Configure <DateTimeOffset>(DateTimeParseHelper.TryParse) .Configure <LocalDate>(DateTimeParseHelper.TryParse) .Configure <LocalTime>(DateTimeParseHelper.TryParse) .ConfigureEnumParse(new EnumParser((Type enumType, string value, out object result) => EnumParseHelper.TryParse(enumType, value, out result)))); }