LSLib.Granny.GR2.GR2Reader.ReadInstance C# (CSharp) Method

ReadInstance() private method

private ReadInstance ( MemberDefinition definition, object node, Type propertyType, object parent ) : object
definition MemberDefinition
node object
propertyType System.Type
parent object
return object
        internal object ReadInstance(MemberDefinition definition, object node, Type propertyType, object parent)
        {
            if (definition.SerializationKind == SerializationKind.UserRaw)
                return definition.Serializer.Read(this, null, definition, 0, parent);

            if (definition.ArraySize == 0)
            {
                return ReadElement(definition, node, propertyType, parent);
            }

            Type elementType = null;
            if (propertyType != null)
            {
                if (definition.SerializationKind == SerializationKind.UserMember)
                {
                    // Do unserialization directly on the whole array if per-member serialization was requested.
                    // This mode is a bit odd, as we resolve StructRef-s for non-arrays, but don't for array types.
                    StructDefinition defn = null;
                    if (definition.Definition.IsValid)
                        defn = definition.Definition.Resolve(this);
                    return definition.Serializer.Read(this, defn, definition, definition.ArraySize, parent);
                }
                else if (propertyType.IsArray)
                {
                    // If the property is a native array (ie. SomeType[]), create an array instance and set its values
                    elementType = propertyType.GetElementType();

                    Array objs = Helpers.CreateArrayInstance(propertyType, (int)definition.ArraySize) as Array;
                    for (int i = 0; i < definition.ArraySize; i++)
                    {
                        objs.SetValue(ReadElement(definition, objs.GetValue(i), elementType, parent), i);
                    }
                    return objs;
                }
                else
                {
                    // For non-native arrays we always assume the property is an IList<T>
                    if (node == null)
                        node = Helpers.CreateInstance(propertyType);

                    var items = node as System.Collections.IList;
                    var type = items.GetType().GetGenericArguments().Single();
                    for (int i = 0; i < definition.ArraySize; i++)
                    {
                        items.Add(ReadElement(definition, null, elementType, parent));
                    }

                    return items;
                }
            }
            else
            {
                for (int i = 0; i < definition.ArraySize; i++)
                    ReadElement(definition, null, null, parent);
                return null;
            }
        }