void IPropertyBagVisitor.Visit <TContainer>(IPropertyBag <TContainer> properties, ref TContainer container)
        {
            m_SerializedReferences?.AddDeserializedReference(container);

            if (properties is IPropertyList <TContainer> collection)
            {
                // no boxing
                foreach (var property in collection.GetProperties(ref container))
                {
                    if (property.HasAttribute <NonSerializedAttribute>() || property.HasAttribute <DontSerializeAttribute>())
                    {
                        continue;
                    }

                    ((IPropertyAccept <TContainer>)property).Accept(this, ref container);
                }
            }
            else
            {
                // boxing
                foreach (var property in properties.GetProperties(ref container))
                {
                    if (property.HasAttribute <NonSerializedAttribute>() || property.HasAttribute <DontSerializeAttribute>())
                    {
                        continue;
                    }

                    ((IPropertyAccept <TContainer>)property).Accept(this, ref container);
                }
            }
        }
        void IPropertyBagVisitor.Visit <TContainer>(IPropertyBag <TContainer> properties, ref TContainer container)
        {
            if (properties is IPropertyWrapper)
            {
                if (properties is IPropertyList <TContainer> propertyList)
                {
                    foreach (var property in propertyList.GetProperties(ref container))
                    {
                        using (CreatePropertyScope(property))
                        {
                            ((IPropertyAccept <TContainer>)property).Accept(this, ref container);
                        }
                    }
                }
                else
                {
                    throw new Exception("PropertyWrapper is missing the built in property bag.");
                }
            }
            else
            {
                if (m_View.Type != TokenType.Object)
                {
                    throw new ArgumentException();
                }

                var obj = m_View.AsObjectView();

                if (!(Property is IPropertyWrapper && m_DisableRootMigration))
                {
                    if (m_Migrations.TryMigrate <TContainer>(obj, out var migrated, this, m_SerializedTypeProvider.Events))
                    {
                        m_SerializedReferences?.AddDeserializedReference(m_Metadata.SerializedId, migrated);
                        container = migrated;
                        return;
                    }
                }

                if (properties is IPropertyList <TContainer> propertyList)
                {
                    foreach (var property in propertyList.GetProperties(ref container))
                    {
                        AcceptProperty(ref container, obj, property);
                    }
                }
                else
                {
                    foreach (var property in properties.GetProperties(ref container))
                    {
                        AcceptProperty(ref container, obj, property);
                    }
                }
            }
        }
Exemple #3
0
        void IPropertyBagVisitor.Visit <TContainer>(IPropertyBag <TContainer> properties, ref TContainer container)
        {
            if (properties is IPropertyWrapper)
            {
                using (var enumerator = properties.GetProperties().GetEnumerator())
                {
                    if (enumerator.MoveNext() && null != enumerator.Current)
                    {
                        var property = enumerator.Current;

                        using (CreatePropertyScope(property))
                        {
                            property.Accept(this, ref container);
                        }
                    }
                    else
                    {
                        throw new InvalidOperationException("IPropertyWrapper has no properties");
                    }
                }
            }
            else
            {
                if (m_View.Type != TokenType.Object)
                {
                    throw new ArgumentException();
                }

                var obj = m_View.AsObjectView();

                if (!(Property is IPropertyWrapper && m_DisableRootMigration))
                {
                    if (m_Migrations.TryMigrate <TContainer>(obj, out var migrated, this, m_SerializedTypeProvider.Events))
                    {
                        m_SerializedReferences?.AddDeserializedReference(m_Metadata.SerializedId, migrated);
                        container = migrated;
                        return;
                    }
                }

                foreach (var property in properties.GetProperties(ref container))
                {
                    if (PropertyChecks.IsPropertyExcludedFromSerialization(property))
                    {
                        continue;
                    }

                    AcceptProperty(ref container, obj, property);
                }
            }
        }
        void IPropertyBagVisitor.Visit <TContainer>(IPropertyBag <TContainer> properties, ref TContainer container)
        {
            m_SerializedReferences?.AddDeserializedReference(container);

            foreach (var property in properties.GetProperties(ref container))
            {
                if (PropertyChecks.IsPropertyExcludedFromSerialization(property))
                {
                    continue;
                }

                property.Accept(this, ref container);
            }
        }
        void IPropertyBagVisitor.Visit <TContainer>(IPropertyBag <TContainer> properties, ref TContainer container)
        {
            m_SerializedReferences?.AddDeserializedReference(container);

            if (properties is IPropertyList <TContainer> collection)
            {
                // no boxing
                foreach (var property in collection.GetProperties(ref container))
                {
                    ((IPropertyAccept <TContainer>)property).Accept(this, ref container);
                }
            }
            else
            {
                // boxing
                foreach (var property in properties.GetProperties(ref container))
                {
                    ((IPropertyAccept <TContainer>)property).Accept(this, ref container);
                }
            }
        }