Beispiel #1
0
        void MapChildMembers(IReference parentReference, int depth = 0)
        {
            depth++;
            if (depth > maxDepth)
            {
                throw new System.Exception("Serialization depth limit reached. Recursive reference?\nTrace:\n" + Utilities.UpwardsDebugTraceRecursive(parentReference, depth));
            }

            var parentValue = parentReference.GetValue();
            var parentType  = parentValue.GetType();

            if (typeof(IList).IsAssignableFrom(parentType))
            {
                var parentIListValue = (IList)parentValue;

                for (int i = 0; i < parentIListValue.Count; i++)
                {
                    var memberReference = new MemberReference(parentReference, i);
                    SetMemberValue(parentIListValue[i], memberReference, depth);
                    parentReference.AddMember(memberReference);
                }
            }
            else
            {
                IEnumerable <MemberInfo> memberInfos;

                if (!memberTypes.ContainsKey(parentType))
                {
                    memberInfos = parentType
                                  .GetMembers(Utilities.GetBindingFlags(mapInstance, mapStatic, mapPublic, mapNonPublic))
                                  .Where(m => EvaluateMemberInfo(m));

                    memberTypes.Add(parentType, memberInfos.ToList());
                }
                else
                {
                    memberInfos = memberTypes[parentType];
                }

                foreach (var memberInfo in memberInfos)
                {
                    if (!TryGetMemberValue(memberInfo, parentReference.GetValue(), out var memberValue))
                    {
                        continue;
                    }

                    var value = new MemberReference(parentReference, memberInfo);

                    SetMemberValue(memberValue, value, depth);

                    parentReference.AddMember(value);
                }
            }
        }