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); } } }