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)); }
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); } }
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); } }