internal KeyValuePair <string, object> ConvertKey(KeyValuePair <string, object> obj, SerializationType type) { var key = obj.Key; var value = obj.Value; if (value is Array) { value = ((object[])value).Select((x) => ConvertKey(new KeyValuePair <string, object>("", x), type).Value); } else if (value is Model) { if (type != SerializationType.Plain && SerializationRuleForField(key, type) == NestedModelSerializationRule.IdParameter) { key += "_id"; value = ((Model)value).Id; } else { value = ((Model)value).ToDictionary(type); } } else if (value is AbstractModel) { value = ((AbstractModel)value).ToDictionary(type); } #if NET40 else if (value != null && value.GetType().IsEnum) #else else if (value != null && value.GetType().GetTypeInfo().IsEnum) #endif { value = EnumMagic.ConvertToString((Enum)value); } return(new KeyValuePair <string, object>(key, value)); }
protected object CastAttribute(Type type, object obj) { #if NET40 var info = type; #else var info = type.GetTypeInfo(); #endif #if NET40 if (obj != null && info.IsInstanceOfType(obj)) #else if (obj != null && info.IsAssignableFrom(obj.GetType().GetTypeInfo())) #endif { return(obj); } else if (info.IsEnum) { return(EnumMagic.ConvertFromString(type, obj.ToString())); } else if (info.IsArray) { var elementType = type.GetElementType(); var old = (Array)obj; var arr = Array.CreateInstance(elementType, old.Length); for (var i = 0; i < arr.Length; i++) { arr.SetValue(CastAttribute(elementType, old.GetValue(i)), i); } return(arr); } else if (info.IsPrimitive) { return(Convert.ChangeType(obj, type, CultureInfo.InvariantCulture)); } else if (obj != null && obj.GetType() == typeof(Int64) && type == typeof(DateTime)) { return(Utils.ConvertToDateTime((Int64)obj)); } else if (info.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>)) { #if PCL var valueType = type.GetTypeInfo().GenericTypeParameters; #elif NET40 var valueType = type.GetGenericArguments(); #else var valueType = type.GetTypeInfo().GetGenericArguments(); #endif object[] args = obj == null ? null : new[] { CastAttribute(valueType[0], obj) }; return(Activator.CreateInstance(type, args)); } #if NET40 else if (obj != null && info.IsSubclassOf(typeof(AbstractModel)) && (obj.GetType() == typeof(AbstractModel) || obj.GetType().IsSubclassOf(typeof(AbstractModel)))) #else else if (obj != null && info.IsSubclassOf(typeof(AbstractModel)) && (obj.GetType() == typeof(AbstractModel) || obj.GetType().GetTypeInfo().IsSubclassOf(typeof(AbstractModel)))) #endif { var oldModel = (AbstractModel)obj; var model = (AbstractModel)Activator.CreateInstance (type, new object[] { _service }); model.LoadFrom(oldModel); return(model); } return(obj); }