예제 #1
0
        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));
        }
예제 #2
0
        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);
        }