/// <summary> /// See base /// </summary> public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) { return(null); } if (reader.TokenType == JsonToken.String) { var val = reader.Value; if (val != null && !string.IsNullOrEmpty(val.ToString())) { return(DwarfHelper.Load(objectType, Guid.Parse(val.ToString()))); } return(null); } var jObject = JObject.Load(reader); object obj = null; if (jObject.Property("id") != null) { var id = jObject.Property("id").Value.ToObject <Guid?>(); if (id.HasValue) { obj = DwarfHelper.Load(objectType, id.Value); } if (obj == null) { if (HttpContext.Current.Items.Contains(id.Value.ToString())) { obj = HttpContext.Current.Items[id.Value.ToString()]; } else { obj = DwarfHelper.CreateInstance(objectType); ((IDwarf)obj).Id = id; HttpContext.Current.Items[id.Value.ToString()] = obj; } } } else { obj = DwarfHelper.CreateInstance(objectType); } if (obj == null) { throw new JsonSerializationException("No object created."); } var writer = new StringWriter(); serializer.Serialize(writer, jObject); using (var newReader = new JsonTextReader(new StringReader(writer.ToString()))) { newReader.Culture = reader.Culture; newReader.DateParseHandling = reader.DateParseHandling; newReader.DateTimeZoneHandling = reader.DateTimeZoneHandling; newReader.FloatParseHandling = reader.FloatParseHandling; serializer.Populate(newReader, obj); } return(obj); }
/// <summary> /// Converts an SqlDataReader row into an object of the type T /// </summary> protected T TupleToObject <T>(DbDataReader sdr) where T : Dwarf <T>, new() { var type = typeof(T); var obj = DwarfHelper.CreateInstance <T>(); for (var i = 0; i < sdr.FieldCount; i++) { var propertyName = sdr.GetName(i); var propertyValue = sdr.GetValue(i); var pi = PropertyHelper.GetProperty(type, propertyName) ?? PropertyHelper.GetProperty(type, propertyName.Replace("Id", string.Empty)); if (pi == null) { continue; } if (propertyValue is DBNull) { propertyValue = pi.ContainedProperty.PropertyType == typeof(string) ? string.Empty : null; } else if (pi.PropertyType.Implements <IGem>()) { propertyValue = Cfg.LoadGem[pi.PropertyType](propertyValue.ToString()); } else if (pi.PropertyType.IsEnum() && propertyValue != null) { propertyValue = Enum.Parse(pi.PropertyType.GetTrueEnumType(), propertyValue.ToString()); } else if (pi.PropertyType.Implements <Type>()) { propertyValue = typeof(T).Assembly.GetType(propertyValue.ToString()); } else if (pi.PropertyType.Implements <IDwarf>()) { var att = DwarfPropertyAttribute.GetAttribute(pi.ContainedProperty); if (att != null) { if (DwarfPropertyAttribute.IsFK(pi)) { obj.SetOriginalValue(pi.Name, propertyValue); if (att.EagerLoad) { var targetType = pi.PropertyType; if (propertyValue != null) { PropertyHelper.SetValue(obj, pi.Name, Cfg.LoadExpressions[targetType]((Guid)propertyValue)); } } continue; } } } if (pi.PropertyType == typeof(string) && propertyValue != null) { propertyValue = propertyValue.ToString().Replace("\\r\\n", "\r\n"); } PropertyHelper.SetValue(obj, pi.Name, propertyValue); obj.SetOriginalValue(pi.Name, propertyValue); } obj.IsSaved = true; return(obj); }