Пример #1
0
        private static T Deserialize <T>(List <ParsingObject> objects)
        {
            T   result;
            var type = typeof(T);

            if (objects.Count == 1 && objects.First().Name == "")
            {
                if (objects.First().ObjType == ParsingObject.ObjectType.Primitive)
                {
                    return((T)Convert.ChangeType(objects.First().ContentInstance.Trim('\"'), type));
                }
                if (objects.First().ObjType == ParsingObject.ObjectType.Collection)
                {
                    if (ParserUtils.IsEnumerable(type))
                    {
                        return((T)GetEnumerableInstance(objects.First(), type));
                    }
                }
            }

            result = (T)Activator.CreateInstance(type);
            foreach (var obj in objects)
            {
                var name            = obj.Name.Trim('\"');
                var contentInstance = obj.ContentInstance.Trim('\"');
                var memberType      = ParserUtils.GetMemberType(type, name);
                if (obj.ObjType == ParsingObject.ObjectType.Primitive)
                {
                    object converted;
                    if (memberType.IsEnum)
                    {
                        converted = Enum.Parse(memberType, contentInstance);
                    }
                    else
                    {
                        converted = Convert.ChangeType(contentInstance, memberType);
                    }
                    ParserUtils.SetMemberContent(result, name, converted);
                }
                else if (obj.ObjType == ParsingObject.ObjectType.ComplexObject)
                {
                    var parsed = typeof(JsonParser)
                                 .GetMethod("Deserialize")
                                 .MakeGenericMethod(memberType)
                                 .Invoke(null, new object[] { Parse(contentInstance) });
                    ParserUtils.SetMemberContent(result, name, parsed);
                }
                else
                {
                    if (ParserUtils.IsEnumerable(memberType))
                    {
                        ParserUtils.SetMemberContent(result, name, GetEnumerableInstance(obj, memberType));
                    }
                    else
                    {
                        throw new Exception("Invalid deserialization");
                    }
                }
            }

            return(result);
        }