public static void GetChildObjects(
            ISaveContext context,
            ContainerDefinition containerDefinition,
            ContainerType containerType,
            object target,
            List <object> collectedObjects)
        {
            if (containerDefinition.CollectObjectsMethod != null)
            {
                if (containerDefinition.HasNoChildObject)
                {
                    return;
                }
                containerDefinition.CollectObjectsMethod(target, collectedObjects);
            }
            else
            {
                switch (containerType)
                {
                case ContainerType.List:
                    IList list = (IList)target;
                    for (int index = 0; index < list.Count; ++index)
                    {
                        object childElement = list[index];
                        if (childElement != null)
                        {
                            ContainerSaveData.ProcessChildObjectElement(childElement, context, collectedObjects);
                        }
                    }
                    break;

                case ContainerType.Dictionary:
                    IDictionary dictionary = (IDictionary)target;
                    foreach (object key in (IEnumerable)dictionary.Keys)
                    {
                        ContainerSaveData.ProcessChildObjectElement(key, context, collectedObjects);
                    }
                    IEnumerator enumerator1 = dictionary.Values.GetEnumerator();
                    try
                    {
                        while (enumerator1.MoveNext())
                        {
                            object current = enumerator1.Current;
                            if (current != null)
                            {
                                ContainerSaveData.ProcessChildObjectElement(current, context, collectedObjects);
                            }
                        }
                        break;
                    }
                    finally
                    {
                        if (enumerator1 is IDisposable disposable8)
                        {
                            disposable8.Dispose();
                        }
                    }

                case ContainerType.Array:
                    Array array = (Array)target;
                    for (int index = 0; index < array.Length; ++index)
                    {
                        object childElement = array.GetValue(index);
                        if (childElement != null)
                        {
                            ContainerSaveData.ProcessChildObjectElement(childElement, context, collectedObjects);
                        }
                    }
                    break;

                case ContainerType.Queue:
                    IEnumerator enumerator2 = ((IEnumerable)target).GetEnumerator();
                    try
                    {
                        while (enumerator2.MoveNext())
                        {
                            object current = enumerator2.Current;
                            if (current != null)
                            {
                                ContainerSaveData.ProcessChildObjectElement(current, context, collectedObjects);
                            }
                        }
                        break;
                    }
                    finally
                    {
                        if (enumerator2 is IDisposable disposable9)
                        {
                            disposable9.Dispose();
                        }
                    }

                default:
                    using (IEnumerator <object> enumerator3 = ContainerSaveData.GetChildElements(containerType, target).GetEnumerator())
                    {
                        while (enumerator3.MoveNext())
                        {
                            ContainerSaveData.ProcessChildObjectElement(enumerator3.Current, context, collectedObjects);
                        }
                        break;
                    }
                }
            }
        }