private void CreateChildren()
        {
            if (actualValue == null)
            {
                return;
            }

            DestroyChildren();

            circularReference = CheckCircularReference(this);

            UnityEngine.Debug.Assert(circularReference == null, "circularReference == null");

            FieldInfo[] fieldInfos = EditorReflector.GetFields(actualType);
            for (int i = 0; i < fieldInfos.Length; i++)
            {
                FieldInfo fi = fieldInfos[i];
                if (ShouldReflectProperty(fi))
                {
                    children.Add(CreateChild(this, fi.Name, fi.FieldType, fi.GetValue(actualValue)));
                }
            }
        }
        private void UpdateChildren()
        {
            FieldInfo[] fieldInfos = EditorReflector.GetFields(actualType);

            childSet = childSet ?? new List <ReflectedProperty>(8);

            for (int i = 0; i < children.Count; i++)
            {
                childSet.Add(children[i]);
            }

            for (int i = 0; i < fieldInfos.Length; i++)
            {
                FieldInfo info = fieldInfos[i];
                if (ShouldReflectProperty(info))
                {
                    ReflectedProperty child = children.Find(info, (c, fInfo) => c.name == fInfo.Name);
                    if (child != null)
                    {
                        UpdateChildIntenal(child, info.GetValue(actualValue));
                        childSet.Remove(child);
                    }
                    else
                    {
                        children.Add(CreateChild(this, info.Name, info.FieldType, info.GetValue(actualValue)));
                    }
                }
            }

            for (int i = 0; i < childSet.Count; i++)
            {
                children.Remove(childSet[i]);
            }

            childSet.Clear();
            UnityEngine.Debug.Assert(isDirty == false && changedChildren.Count == 0);
        }