internal static U Convert <U>(this RavenJToken token, bool cast) { if (cast) { // HACK return((U)(object)token); } else { 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); } return((U)System.Convert.ChangeType(value.Value, targetType, CultureInfo.InvariantCulture)); } }
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); } }
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)); }