Esempio n. 1
0
        internal static U Convert <U>(this RavenJToken token, bool cast)
        {
            if (cast)
            {
                // HACK
                return((U)(object)token);
            }
            if (token == null)
            {
                return(default(U));
            }

            var value = token as RavenJValue;

            if (value == null)
            {
                throw new InvalidCastException("Cannot cast {0} to {1}.".FormatWith(CultureInfo.InvariantCulture, token.GetType(), typeof(U)));
            }

            if (value.Value is U)
            {
                return((U)value.Value);
            }

            Type targetType = typeof(U);

            if (targetType.IsGenericType && targetType.GetGenericTypeDefinition() == typeof(Nullable <>))
            {
                if (value.Value == null)
                {
                    return(default(U));
                }

                targetType = Nullable.GetUnderlyingType(targetType);
            }
            if (targetType == typeof(Guid))
            {
                if (value.Value == null)
                {
                    return(default(U));
                }
                return((U)(object)new Guid(value.Value.ToString()));
            }
            if (targetType == typeof(string))
            {
                if (value.Value == null)
                {
                    return(default(U));
                }
                return((U)(object)value.Value.ToString());
            }
            if (targetType == typeof(DateTime) && value.Value is string)
            {
                DateTime dateTime;
                if (DateTime.TryParseExact((string)value.Value, Default.DateTimeFormatsToRead, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTime))
                {
                    return((U)(object)dateTime);
                }

                dateTime = RavenJsonTextReader.ParseDateMicrosoft((string)value.Value);
                return((U)(object)dateTime);
            }
            return((U)System.Convert.ChangeType(value.Value, targetType, CultureInfo.InvariantCulture));
        }
Esempio n. 2
0
        internal static U Convert <U>(this RavenJToken token, bool cast)
        {
            if (cast)
            {
                // HACK
                return((U)(object)token);
            }
            if (token == null || token.Type == JTokenType.Null)
            {
                return(default(U));
            }

            var value = token as RavenJValue;

            if (value == null)
            {
                throw new InvalidCastException("Cannot cast {0} to {1}.".FormatWith(CultureInfo.InvariantCulture, token.GetType(), typeof(U)));
            }

            if (value.Value is U)
            {
                return((U)value.Value);
            }

            Type targetType = typeof(U);

            if (targetType.IsGenericType() && targetType.GetGenericTypeDefinition() == typeof(Nullable <>))
            {
                if (value.Value == null)
                {
                    return(default(U));
                }

                targetType = Nullable.GetUnderlyingType(targetType);
            }
            if (targetType == typeof(Guid))
            {
                if (value.Value == null)
                {
                    return(default(U));
                }
                return((U)(object)new Guid(value.Value.ToString()));
            }
            if (targetType == typeof(string))
            {
                if (value.Value == null)
                {
                    return(default(U));
                }
                return((U)(object)value.Value.ToString());
            }
            if (targetType == typeof(DateTime))
            {
                var s = value.Value as string;
                if (s != null)
                {
                    DateTime dateTime;
                    if (DateTime.TryParseExact(s, Default.DateTimeFormatsToRead, CultureInfo.InvariantCulture,
                                               DateTimeStyles.RoundtripKind, out dateTime))
                    {
                        return((U)(object)dateTime);
                    }

                    dateTime = RavenJsonTextReader.ParseDateMicrosoft(s);
                    return((U)(object)dateTime);
                }
                if (value.Value is DateTimeOffset)
                {
                    return((U)(object)((DateTimeOffset)value.Value).UtcDateTime);
                }
            }
            if (targetType == typeof(DateTimeOffset))
            {
                var s = value.Value as string;
                if (s != null)
                {
                    DateTimeOffset dateTimeOffset;
                    if (DateTimeOffset.TryParseExact(s, Default.DateTimeFormatsToRead, CultureInfo.InvariantCulture,
                                                     DateTimeStyles.RoundtripKind, out dateTimeOffset))
                    {
                        return((U)(object)dateTimeOffset);
                    }

                    return(default(U));
                }
                if (value.Value is DateTime)
                {
                    return((U)(object)(new DateTimeOffset((DateTime)value.Value)));
                }
            }
            if (targetType == typeof(byte[]) && value.Value is string)
            {
                return((U)(object)System.Convert.FromBase64String((string)value.Value));
            }

            if (value.Value == null && typeof(U).IsValueType)
            {
                throw new InvalidOperationException("value.Value == null and conversion target type is not nullable");
            }

            try
            {
                return((U)System.Convert.ChangeType(value.Value, targetType, CultureInfo.InvariantCulture));
            }
            catch (Exception e)
            {
                if (value.Value != null)
                {
                    throw new InvalidOperationException(string.Format("Unable to find suitable conversion for {0} since it is not predefined and does not implement IConvertible. ", value.Value.GetType()), e);
                }

                throw new InvalidOperationException(string.Format("Unable to find suitable conversion for {0} since it is not predefined ", value), e);
            }
        }
Esempio n. 3
0
        public static T Convert <T>(object value, bool cast)
        {
            if (cast)
            {
                // HACK
                return((T)value);
            }

            if (value == null)
            {
                return(default(T));
            }

            if (value is T)
            {
                return((T)value);
            }

            Type targetType = typeof(T);

            if (targetType.GetTypeInfo().IsGenericType&& targetType.GetGenericTypeDefinition() == typeof(Nullable <>))
            {
                targetType = Nullable.GetUnderlyingType(targetType);
            }

            if (targetType == typeof(Guid))
            {
                return((T)(object)new Guid(value.ToString()));
            }

            if (targetType == typeof(string))
            {
                return((T)(object)value.ToString());
            }

            if (targetType == typeof(DateTime))
            {
                if (value is DateTimeOffset)
                {
                    return((T)(object)((DateTimeOffset)value).DateTime);
                }

                var s = value as string;
                if (s == null)
                {
                    var lzv = value as LazyStringValue;
                    if (lzv != null)
                    {
                        s = lzv;
                    }
                }

                if (s != null)
                {
                    DateTime dateTime;
                    if (DateTime.TryParseExact(s, Default.DateTimeFormatsToRead, CultureInfo.InvariantCulture,
                                               DateTimeStyles.RoundtripKind, out dateTime))
                    {
                        return((T)(object)dateTime);
                    }

                    dateTime = RavenJsonTextReader.ParseDateMicrosoft(s);
                    return((T)(object)dateTime);
                }
            }

            if (targetType == typeof(DateTimeOffset))
            {
                var s = value as string ?? value as LazyStringValue;

                if (s != null)
                {
                    DateTimeOffset dateTimeOffset;
                    if (DateTimeOffset.TryParseExact(s, Default.DateTimeFormatsToRead, CultureInfo.InvariantCulture,
                                                     DateTimeStyles.RoundtripKind, out dateTimeOffset))
                    {
                        return((T)(object)dateTimeOffset);
                    }

                    return(default(T));
                }
            }

            var lsv = value as LazyStringValue;

            if (lsv != null)
            {
                value = (string)lsv;
            }

            try
            {
                return((T)System.Convert.ChangeType(value, targetType, CultureInfo.InvariantCulture));
            }
            catch (Exception e)
            {
                throw new InvalidOperationException(string.Format("Unable to find suitable conversion for {0} since it is not predefined ", value), e);
            }
        }