Example #1
0
        private static ParseStringDelegate GetParseFn()
        {
            var nullableType = Nullable.GetUnderlyingType(typeof(T));

            if (nullableType == null)
            {
                var typeCode = typeof(T).GetTypeCode();
                switch (typeCode)
                {
                case TypeCode.Boolean:
                    //Lots of kids like to use '1', HTML checkboxes use 'on' as a soft convention
                    return(value =>
                           value.Length == 1 ?
                           value == "1"
                            : value.Length == 2 ?
                           value == "on" :
                           bool.Parse(value));

                case TypeCode.Byte:
                    return(value => byte.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.SByte:
                    return(value => sbyte.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Int16:
                    return(value => short.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.UInt16:
                    return(value => ushort.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Int32:
                    return(value => int.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.UInt32:
                    return(value => uint.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Int64:
                    return(value => long.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.UInt64:
                    return(value => ulong.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Single:
                    return(value => float.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Double:
                    return(value => double.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Decimal:
                    return(value => decimal.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.DateTime:
                    return(value => DateTimeSerializer.ParseShortestXsdDateTime(value));

                case TypeCode.Char:
                    return(value =>
                    {
                        char cValue;
                        return char.TryParse(value, out cValue) ? cValue : '\0';
                    });
                }

                if (typeof(T) == typeof(Guid))
                {
                    return(value => new Guid(value));
                }
                if (typeof(T) == typeof(DateTimeOffset))
                {
                    return(value => DateTimeSerializer.ParseDateTimeOffset(value));
                }
                if (typeof(T) == typeof(TimeSpan))
                {
                    return(value => DateTimeSerializer.ParseTimeSpan(value));
                }
            }
            else
            {
                var typeCode = nullableType.GetTypeCode();
                switch (typeCode)
                {
                case TypeCode.Boolean:
                    return(value => string.IsNullOrEmpty(value) ?
                           (bool?)null
                            : value.Length == 1 ?
                           value == "1"
                            : value.Length == 2 ?
                           value == "on" :
                           bool.Parse(value));

                case TypeCode.Byte:
                    return(value => string.IsNullOrEmpty(value) ? (byte?)null : byte.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.SByte:
                    return(value => string.IsNullOrEmpty(value) ? (sbyte?)null : sbyte.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Int16:
                    return(value => string.IsNullOrEmpty(value) ? (short?)null : short.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.UInt16:
                    return(value => string.IsNullOrEmpty(value) ? (ushort?)null : ushort.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Int32:
                    return(value => string.IsNullOrEmpty(value) ? (int?)null : int.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.UInt32:
                    return(value => string.IsNullOrEmpty(value) ? (uint?)null : uint.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Int64:
                    return(value => string.IsNullOrEmpty(value) ? (long?)null : long.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.UInt64:
                    return(value => string.IsNullOrEmpty(value) ? (ulong?)null : ulong.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Single:
                    return(value => string.IsNullOrEmpty(value) ? (float?)null : float.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Double:
                    return(value => string.IsNullOrEmpty(value) ? (double?)null : double.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Decimal:
                    return(value => string.IsNullOrEmpty(value) ? (decimal?)null : decimal.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.DateTime:
                    return(value => DateTimeSerializer.ParseShortestNullableXsdDateTime(value));

                case TypeCode.Char:
                    return(value =>
                    {
                        char cValue;
                        return string.IsNullOrEmpty(value) ? (char?)null : char.TryParse(value, out cValue) ? cValue : '\0';
                    });
                }

                if (typeof(T) == typeof(TimeSpan?))
                {
                    return(value => DateTimeSerializer.ParseNullableTimeSpan(value));
                }
                if (typeof(T) == typeof(Guid?))
                {
                    return(value => string.IsNullOrEmpty(value) ? (Guid?)null : new Guid(value));
                }
                if (typeof(T) == typeof(DateTimeOffset?))
                {
                    return(value => DateTimeSerializer.ParseNullableDateTimeOffset(value));
                }
            }

            return(null);
        }
Example #2
0
        private static ParseStringDelegate GetParseFn()
        {
            //Note the generic typeof(T) is faster than using var type = typeof(T)
            if (typeof(T) == typeof(bool))
            {
                return(value => bool.Parse(value));
            }
            if (typeof(T) == typeof(byte))
            {
                return(value => byte.Parse(value));
            }
            if (typeof(T) == typeof(sbyte))
            {
                return(value => sbyte.Parse(value));
            }
            if (typeof(T) == typeof(short))
            {
                return(value => short.Parse(value));
            }
            if (typeof(T) == typeof(int))
            {
                return(value => int.Parse(value));
            }
            if (typeof(T) == typeof(long))
            {
                return(value => long.Parse(value));
            }
            if (typeof(T) == typeof(float))
            {
                return(value => float.Parse(value, CultureInfo.InvariantCulture));
            }
            if (typeof(T) == typeof(double))
            {
                return(value => double.Parse(value, CultureInfo.InvariantCulture));
            }
            if (typeof(T) == typeof(decimal))
            {
                return(value => decimal.Parse(value, CultureInfo.InvariantCulture));
            }

            if (typeof(T) == typeof(Guid))
            {
                return(value => new Guid(value));
            }
            if (typeof(T) == typeof(DateTime?))
            {
                return(value => DateTimeSerializer.ParseShortestNullableXsdDateTime(value));
            }
            if (typeof(T) == typeof(DateTime) || typeof(T) == typeof(DateTime?))
            {
                return(value => DateTimeSerializer.ParseShortestXsdDateTime(value));
            }
            if (typeof(T) == typeof(DateTimeOffset) || typeof(T) == typeof(DateTimeOffset?))
            {
                return(value => DateTimeSerializer.ParseDateTimeOffset(value));
            }
            if (typeof(T) == typeof(TimeSpan))
            {
                return(value => DateTimeSerializer.ParseTimeSpan(value));
            }
            if (typeof(T) == typeof(TimeSpan?))
            {
                return(value => DateTimeSerializer.ParseNullableTimeSpan(value));
            }
#if !MONOTOUCH && !SILVERLIGHT && !XBOX
            if (typeof(T) == typeof(System.Data.Linq.Binary))
            {
                return(value => new System.Data.Linq.Binary(Convert.FromBase64String(value)));
            }
#endif
            if (typeof(T) == typeof(char))
            {
                char cValue;
                return(value => char.TryParse(value, out cValue) ? cValue : '\0');
            }
            if (typeof(T) == typeof(ushort))
            {
                return(value => ushort.Parse(value));
            }
            if (typeof(T) == typeof(uint))
            {
                return(value => uint.Parse(value));
            }
            if (typeof(T) == typeof(ulong))
            {
                return(value => ulong.Parse(value));
            }

            if (typeof(T) == typeof(bool?))
            {
                return(value => value == null ? (bool?)null : bool.Parse(value));
            }
            if (typeof(T) == typeof(byte?))
            {
                return(value => value == null ? (byte?)null : byte.Parse(value));
            }
            if (typeof(T) == typeof(sbyte?))
            {
                return(value => value == null ? (sbyte?)null : sbyte.Parse(value));
            }
            if (typeof(T) == typeof(short?))
            {
                return(value => value == null ? (short?)null : short.Parse(value));
            }
            if (typeof(T) == typeof(int?))
            {
                return(value => value == null ? (int?)null : int.Parse(value));
            }
            if (typeof(T) == typeof(long?))
            {
                return(value => value == null ? (long?)null : long.Parse(value));
            }
            if (typeof(T) == typeof(float?))
            {
                return(value => value == null ? (float?)null : float.Parse(value, CultureInfo.InvariantCulture));
            }
            if (typeof(T) == typeof(double?))
            {
                return(value => value == null ? (double?)null : double.Parse(value, CultureInfo.InvariantCulture));
            }
            if (typeof(T) == typeof(decimal?))
            {
                return(value => value == null ? (decimal?)null : decimal.Parse(value, CultureInfo.InvariantCulture));
            }

            if (typeof(T) == typeof(TimeSpan?))
            {
                return(value => value == null ? (TimeSpan?)null : TimeSpan.Parse(value));
            }
            if (typeof(T) == typeof(Guid?))
            {
                return(value => value == null ? (Guid?)null : new Guid(value));
            }
            if (typeof(T) == typeof(ushort?))
            {
                return(value => value == null ? (ushort?)null : ushort.Parse(value));
            }
            if (typeof(T) == typeof(uint?))
            {
                return(value => value == null ? (uint?)null : uint.Parse(value));
            }
            if (typeof(T) == typeof(ulong?))
            {
                return(value => value == null ? (ulong?)null : ulong.Parse(value));
            }

            if (typeof(T) == typeof(char?))
            {
                char cValue;
                return(value => value == null ? (char?)null : char.TryParse(value, out cValue) ? cValue : '\0');
            }

            return(null);
        }
Example #3
0
        private static ParseStringSpanDelegate GetParseStringSpanFn()
        {
            var nullableType = Nullable.GetUnderlyingType(typeof(T));

            if (nullableType == null)
            {
                var typeCode = typeof(T).GetTypeCode();
                switch (typeCode)
                {
                case TypeCode.Boolean:
                    return(value => value.ParseBoolean());

                case TypeCode.SByte:
                    return(SignedInteger <sbyte> .ParseObject);

                case TypeCode.Byte:
                    return(UnsignedInteger <byte> .ParseObject);

                case TypeCode.Int16:
                    return(SignedInteger <short> .ParseObject);

                case TypeCode.UInt16:
                    return(UnsignedInteger <ushort> .ParseObject);

                case TypeCode.Int32:
                    return(SignedInteger <int> .ParseObject);

                case TypeCode.UInt32:
                    return(UnsignedInteger <uint> .ParseObject);

                case TypeCode.Int64:
                    return(SignedInteger <long> .ParseObject);

                case TypeCode.UInt64:
                    return(UnsignedInteger <ulong> .ParseObject);

                case TypeCode.Single:
                    return(value => MemoryProvider.Instance.ParseFloat(value));

                case TypeCode.Double:
                    return(value => MemoryProvider.Instance.ParseDouble(value));

                case TypeCode.Decimal:
                    return(value => MemoryProvider.Instance.ParseDecimal(value));

                case TypeCode.DateTime:
                    return(value => DateTimeSerializer.ParseShortestXsdDateTime(value.ToString()));

                case TypeCode.Char:
                    return(value => value.Length == 0 ? (char)0 : value.Length == 1 ? value[0] : JsonTypeSerializer.Unescape(value)[0]);
                }

                if (typeof(T) == typeof(Guid))
                {
                    return(value => value.ParseGuid());
                }
                if (typeof(T) == typeof(DateTimeOffset))
                {
                    return(value => DateTimeSerializer.ParseDateTimeOffset(value.ToString()));
                }
                if (typeof(T) == typeof(TimeSpan))
                {
                    return(value => DateTimeSerializer.ParseTimeSpan(value.ToString()));
                }
#if NET6_0
                if (typeof(T) == typeof(DateOnly))
                {
                    return(value => DateOnly.FromDateTime(DateTimeSerializer.ParseShortestXsdDateTime(value.ToString())));
                }
                if (typeof(T) == typeof(TimeOnly))
                {
                    return(value => TimeOnly.FromTimeSpan(DateTimeSerializer.ParseTimeSpan(value.ToString())));
                }
#endif
            }
            else
            {
                var typeCode = nullableType.GetTypeCode();
                switch (typeCode)
                {
                case TypeCode.Boolean:
                    return(value => value.IsNullOrEmpty()
                            ? (bool?)null
                            : value.ParseBoolean());

                case TypeCode.SByte:
                    return(SignedInteger <sbyte> .ParseNullableObject);

                case TypeCode.Byte:
                    return(UnsignedInteger <byte> .ParseNullableObject);

                case TypeCode.Int16:
                    return(SignedInteger <short> .ParseNullableObject);

                case TypeCode.UInt16:
                    return(UnsignedInteger <ushort> .ParseNullableObject);

                case TypeCode.Int32:
                    return(SignedInteger <int> .ParseNullableObject);

                case TypeCode.UInt32:
                    return(UnsignedInteger <uint> .ParseNullableObject);

                case TypeCode.Int64:
                    return(SignedInteger <long> .ParseNullableObject);

                case TypeCode.UInt64:
                    return(UnsignedInteger <ulong> .ParseNullableObject);

                case TypeCode.Single:
                    return(value => value.IsNullOrEmpty() ? (float?)null : value.ParseFloat());

                case TypeCode.Double:
                    return(value => value.IsNullOrEmpty() ? (double?)null : value.ParseDouble());

                case TypeCode.Decimal:
                    return(value => value.IsNullOrEmpty() ? (decimal?)null : value.ParseDecimal());

                case TypeCode.DateTime:
                    return(value => DateTimeSerializer.ParseShortestNullableXsdDateTime(value.ToString()));

                case TypeCode.Char:
                    return(value => value.IsEmpty ? (char?)null : value.Length == 1 ? value[0] : JsonTypeSerializer.Unescape(value)[0]);
                }

                if (typeof(T) == typeof(TimeSpan?))
                {
                    return(value => DateTimeSerializer.ParseNullableTimeSpan(value.ToString()));
                }
                if (typeof(T) == typeof(Guid?))
                {
                    return(value => value.IsNullOrEmpty() ? (Guid?)null : value.ParseGuid());
                }
                if (typeof(T) == typeof(DateTimeOffset?))
                {
                    return(value => DateTimeSerializer.ParseNullableDateTimeOffset(value.ToString()));
                }
#if NET6_0
                if (typeof(T) == typeof(DateOnly?))
                {
                    return(value => value.IsNullOrEmpty() ? default : DateOnly.FromDateTime(DateTimeSerializer.ParseShortestXsdDateTime(value.ToString())));
                }
                if (typeof(T) == typeof(TimeOnly?))
                {
                    return(value => value.IsNullOrEmpty() ? default : TimeOnly.FromTimeSpan(DateTimeSerializer.ParseTimeSpan(value.ToString())));
                }
#endif
            }

            return(null);
        }
Example #4
0
        private static ParseStringDelegate GetParseFn()
        {
            var nullableType = Nullable.GetUnderlyingType(typeof(T));

            if (nullableType == null)
            {
#if NETFX_CORE
                var typeCode = ReflectionExtensions.GetTypeCode(typeof(T));
#else
                var typeCode = Type.GetTypeCode(typeof(T));
#endif
                switch (typeCode)
                {
                case TypeCode.Boolean:
                    return(value => value.Length == 1 ? value == "1" : bool.Parse(value));

                case TypeCode.Byte:
                    return(value => byte.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.SByte:
                    return(value => sbyte.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Int16:
                    return(value => short.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.UInt16:
                    return(value => ushort.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Int32:
                    return(value => int.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.UInt32:
                    return(value => uint.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Int64:
                    return(value => long.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.UInt64:
                    return(value => ulong.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Single:
                    return(value => float.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Double:
                    return(value => double.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Decimal:
                    return(value => decimal.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.DateTime:
                    return(value => DateTimeSerializer.ParseShortestXsdDateTime(value));

                case TypeCode.Char:
                    char cValue;
                    return(value => char.TryParse(value, out cValue) ? cValue : '\0');
                }

                if (typeof(T) == typeof(Guid))
                {
                    return(value => new Guid(value));
                }
                if (typeof(T) == typeof(DateTimeOffset))
                {
                    return(value => DateTimeSerializer.ParseDateTimeOffset(value));
                }
                if (typeof(T) == typeof(TimeSpan))
                {
                    return(value => DateTimeSerializer.ParseTimeSpan(value));
                }
#if !MONOTOUCH && !SILVERLIGHT && !XBOX && !ANDROID
                if (typeof(T) == typeof(System.Data.Linq.Binary))
                {
                    return(value => new System.Data.Linq.Binary(Convert.FromBase64String(value)));
                }
#endif
            }
            else
            {
#if NETFX_CORE
                var typeCode = ReflectionExtensions.GetTypeCode(nullableType);
#else
                var typeCode = Type.GetTypeCode(nullableType);
#endif
                switch (typeCode)
                {
                case TypeCode.Boolean:
                    return(value => string.IsNullOrEmpty(value) ? (bool?)null : value.Length == 1 ? value == "1" : bool.Parse(value));

                case TypeCode.Byte:
                    return(value => string.IsNullOrEmpty(value) ? (byte?)null : byte.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.SByte:
                    return(value => string.IsNullOrEmpty(value) ? (sbyte?)null : sbyte.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Int16:
                    return(value => string.IsNullOrEmpty(value) ? (short?)null : short.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.UInt16:
                    return(value => string.IsNullOrEmpty(value) ? (ushort?)null : ushort.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Int32:
                    return(value => string.IsNullOrEmpty(value) ? (int?)null : int.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.UInt32:
                    return(value => string.IsNullOrEmpty(value) ? (uint?)null : uint.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Int64:
                    return(value => string.IsNullOrEmpty(value) ? (long?)null : long.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.UInt64:
                    return(value => string.IsNullOrEmpty(value) ? (ulong?)null : ulong.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Single:
                    return(value => string.IsNullOrEmpty(value) ? (float?)null : float.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Double:
                    return(value => string.IsNullOrEmpty(value) ? (double?)null : double.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.Decimal:
                    return(value => string.IsNullOrEmpty(value) ? (decimal?)null : decimal.Parse(value, CultureInfo.InvariantCulture));

                case TypeCode.DateTime:
                    return(value => DateTimeSerializer.ParseShortestNullableXsdDateTime(value));

                case TypeCode.Char:
                    char cValue;
                    return(value => string.IsNullOrEmpty(value) ? (char?)null : char.TryParse(value, out cValue) ? cValue : '\0');
                }

                if (typeof(T) == typeof(TimeSpan?))
                {
                    return(value => DateTimeSerializer.ParseNullableTimeSpan(value));
                }
                if (typeof(T) == typeof(Guid?))
                {
                    return(value => string.IsNullOrEmpty(value) ? (Guid?)null : new Guid(value));
                }
                if (typeof(T) == typeof(DateTimeOffset?))
                {
                    return(value => DateTimeSerializer.ParseNullableDateTimeOffset(value));
                }
            }

            return(null);
        }
        private static ParseStringDelegate GetParseFn()
        {
            //Note the generic typeof(T) is faster than using var type = typeof(T)
            if (typeof(T) == typeof(bool) || typeof(T) == typeof(bool?))
            {
                return(value => bool.Parse(value));
            }
            if (typeof(T) == typeof(byte) || typeof(T) == typeof(byte?))
            {
                return(value => byte.Parse(value));
            }
            if (typeof(T) == typeof(sbyte) || typeof(T) == typeof(sbyte?))
            {
                return(value => sbyte.Parse(value));
            }
            if (typeof(T) == typeof(short) || typeof(T) == typeof(short?))
            {
                return(value => short.Parse(value));
            }
            if (typeof(T) == typeof(int) || typeof(T) == typeof(int?))
            {
                return(value => int.Parse(value));
            }
            if (typeof(T) == typeof(long) || typeof(T) == typeof(long?))
            {
                return(value => long.Parse(value));
            }
            if (typeof(T) == typeof(float) || typeof(T) == typeof(float?))
            {
                return(value => float.Parse(value, CultureInfo.InvariantCulture));
            }
            if (typeof(T) == typeof(double) || typeof(T) == typeof(double?))
            {
                return(value => double.Parse(value, CultureInfo.InvariantCulture));
            }
            if (typeof(T) == typeof(decimal) || typeof(T) == typeof(decimal?))
            {
                return(value => decimal.Parse(value, CultureInfo.InvariantCulture));
            }

            if (typeof(T) == typeof(Guid) || typeof(T) == typeof(Guid?))
            {
                return(value => new Guid(value));
            }
            if (typeof(T) == typeof(DateTime) || typeof(T) == typeof(DateTime?))
            {
                return(value => DateTimeSerializer.ParseShortestXsdDateTime(value));
            }
            if (typeof(T) == typeof(TimeSpan) || typeof(T) == typeof(TimeSpan?))
            {
                return(value => TimeSpan.Parse(value));
            }

            if (typeof(T) == typeof(char) || typeof(T) == typeof(char?))
            {
                char cValue;
                return(value => char.TryParse(value, out cValue) ? cValue : '\0');
            }
            if (typeof(T) == typeof(ushort) || typeof(T) == typeof(ushort?))
            {
                return(value => ushort.Parse(value));
            }
            if (typeof(T) == typeof(uint) || typeof(T) == typeof(uint?))
            {
                return(value => uint.Parse(value));
            }
            if (typeof(T) == typeof(ulong) || typeof(T) == typeof(ulong?))
            {
                return(value => ulong.Parse(value));
            }

            return(null);
        }
        private static ParseStringSegmentDelegate GetParseStringSegmentFn()
        {
            var nullableType = Nullable.GetUnderlyingType(typeof(T));

            if (nullableType == null)
            {
                var typeCode = typeof(T).GetTypeCode();
                switch (typeCode)
                {
                case TypeCode.Boolean:
                    // Lots of kids like to use '1', HTML checkboxes use 'on' as a soft convention
                    return(value =>
                           value.Length == 1 ?
                           value.Equals("1")
                            : value.Length == 2 ?
                           value.Equals("on") :
                           value.ParseBoolean());

                case TypeCode.Byte:
                    return(value => value.ParseByte());

                case TypeCode.SByte:
                    return(value => value.ParseSByte());

                case TypeCode.Int16:
                    return(value => value.ParseInt16());

                case TypeCode.UInt16:
                    return(value => value.ParseUInt16());

                case TypeCode.Int32:
                    return(value => value.ParseInt32());

                case TypeCode.UInt32:
                    return(value => value.ParseUInt32());

                case TypeCode.Int64:
                    return(value => value.ParseInt64());

                case TypeCode.UInt64:
                    return(value => value.ParseUInt64());

                case TypeCode.Single:
                    return(value => float.Parse(value.Value, CultureInfo.InvariantCulture));

                case TypeCode.Double:
                    return(value => double.Parse(value.Value, CultureInfo.InvariantCulture));

                case TypeCode.Decimal:
                    return(value => value.ParseDecimal(allowThousands: true));

                case TypeCode.DateTime:
                    return(value => DateTimeSerializer.ParseShortestXsdDateTime(value.Value));

                case TypeCode.Char:
                    return(value =>
                    {
                        return char.TryParse(value.Value, out var cValue) ? cValue : '\0';
                    });
                }

                if (typeof(T) == typeof(Guid))
                {
                    return(value => value.ParseGuid());
                }
                if (typeof(T) == typeof(DateTimeOffset))
                {
                    return(value => DateTimeSerializer.ParseDateTimeOffset(value.Value));
                }
                if (typeof(T) == typeof(TimeSpan))
                {
                    return(value => DateTimeSerializer.ParseTimeSpan(value.Value));
                }
            }
            else
            {
                var typeCode = nullableType.GetTypeCode();
                switch (typeCode)
                {
                case TypeCode.Boolean:
                    return(value => value.IsNullOrEmpty() ?
                           (bool?)null
                            : value.Length == 1 ?
                           value.Equals("1")
                            : value.Length == 2 ?
                           value.Equals("on") :
                           value.ParseBoolean());

                case TypeCode.Byte:
                    return(value => value.IsNullOrEmpty() ? (byte?)null : value.ParseByte());

                case TypeCode.SByte:
                    return(value => value.IsNullOrEmpty() ? (sbyte?)null : value.ParseSByte());

                case TypeCode.Int16:
                    return(value => value.IsNullOrEmpty() ? (short?)null : value.ParseInt16());

                case TypeCode.UInt16:
                    return(value => value.IsNullOrEmpty() ? (ushort?)null : value.ParseUInt16());

                case TypeCode.Int32:
                    return(value => value.IsNullOrEmpty() ? (int?)null : value.ParseInt32());

                case TypeCode.UInt32:
                    return(value => value.IsNullOrEmpty() ? (uint?)null : value.ParseUInt32());

                case TypeCode.Int64:
                    return(value => value.IsNullOrEmpty() ? (long?)null : value.ParseInt64());

                case TypeCode.UInt64:
                    return(value => value.IsNullOrEmpty() ? (ulong?)null : value.ParseUInt64());

                case TypeCode.Single:
                    return(value => value.IsNullOrEmpty() ? (float?)null : float.Parse(value.Value, CultureInfo.InvariantCulture));

                case TypeCode.Double:
                    return(value => value.IsNullOrEmpty() ? (double?)null : double.Parse(value.Value, CultureInfo.InvariantCulture));

                case TypeCode.Decimal:
                    return(value => value.IsNullOrEmpty() ? (decimal?)null : value.ParseDecimal(allowThousands: true));

                case TypeCode.DateTime:
                    return(value => DateTimeSerializer.ParseShortestNullableXsdDateTime(value.Value));

                case TypeCode.Char:
                    return(value =>
                    {
                        return value.IsNullOrEmpty() ? (char?)null : char.TryParse(value.Value, out var cValue) ? cValue : '\0';
                    });
                }

                if (typeof(T) == typeof(TimeSpan?))
                {
                    return(value => DateTimeSerializer.ParseNullableTimeSpan(value.Value));
                }
                if (typeof(T) == typeof(Guid?))
                {
                    return(value => value.IsNullOrEmpty() ? (Guid?)null : value.ParseGuid());
                }
                if (typeof(T) == typeof(DateTimeOffset?))
                {
                    return(value => DateTimeSerializer.ParseNullableDateTimeOffset(value.Value));
                }
            }

            return(null);
        }
Example #7
0
        private static ParseStringSpanDelegate GetParseStringSpanFn()
        {
            var nullableType = Nullable.GetUnderlyingType(typeof(T));

            if (nullableType == null)
            {
                var typeCode = typeof(T).GetTypeCode();
                switch (typeCode)
                {
                case TypeCode.Boolean:
                    //Lots of kids like to use '1', HTML checkboxes use 'on' as a soft convention
                    return(value =>
                           value.Length == 1 ?
                           value[0] == '1'
                            : value.Length == 2 ?
                           value[0] == 'o' && value[1] == 'n' :
                           value.ParseBoolean());

                case TypeCode.SByte:
                    return(SignedInteger <sbyte> .ParseObject);

                case TypeCode.Byte:
                    return(UnsignedInteger <byte> .ParseObject);

                case TypeCode.Int16:
                    return(SignedInteger <short> .ParseObject);

                case TypeCode.UInt16:
                    return(UnsignedInteger <ushort> .ParseObject);

                case TypeCode.Int32:
                    return(SignedInteger <int> .ParseObject);

                case TypeCode.UInt32:
                    return(UnsignedInteger <uint> .ParseObject);

                case TypeCode.Int64:
                    return(SignedInteger <long> .ParseObject);

                case TypeCode.UInt64:
                    return(UnsignedInteger <ulong> .ParseObject);

                case TypeCode.Single:
                    return(value => MemoryProvider.Instance.ParseFloat(value));

                case TypeCode.Double:
                    return(value => MemoryProvider.Instance.ParseDouble(value));

                case TypeCode.Decimal:
                    return(value => MemoryProvider.Instance.ParseDecimal(value));

                case TypeCode.DateTime:
                    return(value => DateTimeSerializer.ParseShortestXsdDateTime(value.ToString()));

                case TypeCode.Char:
                    return(value => value[0]);
                }

                if (typeof(T) == typeof(Guid))
                {
                    return(value => value.ParseGuid());
                }
                if (typeof(T) == typeof(DateTimeOffset))
                {
                    return(value => DateTimeSerializer.ParseDateTimeOffset(value.ToString()));
                }
                if (typeof(T) == typeof(TimeSpan))
                {
                    return(value => DateTimeSerializer.ParseTimeSpan(value.ToString()));
                }
            }
            else
            {
                var typeCode = nullableType.GetTypeCode();
                switch (typeCode)
                {
                case TypeCode.Boolean:
                    return(value => value.IsNullOrEmpty() ?
                           (bool?)null
                            : value.Length == 1 ?
                           value[0] == '1'
                            : value.Length == 2 ?
                           value[0] == 'o' && value[1] == 'n' :
                           value.ParseBoolean());

                case TypeCode.SByte:
                    return(SignedInteger <sbyte> .ParseNullableObject);

                case TypeCode.Byte:
                    return(UnsignedInteger <byte> .ParseNullableObject);

                case TypeCode.Int16:
                    return(SignedInteger <short> .ParseNullableObject);

                case TypeCode.UInt16:
                    return(UnsignedInteger <ushort> .ParseNullableObject);

                case TypeCode.Int32:
                    return(SignedInteger <int> .ParseNullableObject);

                case TypeCode.UInt32:
                    return(UnsignedInteger <uint> .ParseNullableObject);

                case TypeCode.Int64:
                    return(SignedInteger <long> .ParseNullableObject);

                case TypeCode.UInt64:
                    return(UnsignedInteger <ulong> .ParseNullableObject);

                case TypeCode.Single:
                    return(value => value.IsNullOrEmpty() ? (float?)null : value.ParseFloat());

                case TypeCode.Double:
                    return(value => value.IsNullOrEmpty() ? (double?)null : value.ParseDouble());

                case TypeCode.Decimal:
                    return(value => value.IsNullOrEmpty() ? (decimal?)null : value.ParseDecimal());

                case TypeCode.DateTime:
                    return(value => DateTimeSerializer.ParseShortestNullableXsdDateTime(value.ToString()));

                case TypeCode.Char:
                    return(value => value.IsEmpty ? (char?)null : value[0]);
                }

                if (typeof(T) == typeof(TimeSpan?))
                {
                    return(value => DateTimeSerializer.ParseNullableTimeSpan(value.ToString()));
                }
                if (typeof(T) == typeof(Guid?))
                {
                    return(value => value.IsNullOrEmpty() ? (Guid?)null : value.ParseGuid());
                }
                if (typeof(T) == typeof(DateTimeOffset?))
                {
                    return(value => DateTimeSerializer.ParseNullableDateTimeOffset(value.ToString()));
                }
            }

            return(null);
        }