private string DumpElement(object element, int depth = 0) { depth++; if (depth > 10) { return(""); } try { if (element == null || element is ValueType || element is string) { Write(FormatValue(element)); } else if (element is Instance ins) { Write($"Instance {MoveItTool.InstanceIDDebug(ins.id)}:{ins.Info.Prefab}"); } else if (element is IInfo info) { Write($"IInfo {info.Name}"); } else { var objectType = element.GetType(); if (!typeof(IEnumerable).IsAssignableFrom(objectType)) { Write("{{{0}}}", objectType.FullName); _hashListOfFoundElements.Add(element.GetHashCode()); _level++; } IEnumerable enumerableElement = element as IEnumerable; if (enumerableElement != null) { foreach (object item in enumerableElement) { if (item is IEnumerable && !(item is string)) { _level++; DumpElement(item, depth); _level--; } else { if (!AlreadyTouched(item)) { DumpElement(item, depth); } else { Write("{{{0}}} <-- bidirectional reference found", item.GetType().FullName); } } } } else { MemberInfo[] members = element.GetType().GetMembers(BindingFlags.Public | BindingFlags.Instance); foreach (var memberInfo in members) { var fieldInfo = memberInfo as FieldInfo; var propertyInfo = memberInfo as PropertyInfo; if (fieldInfo == null && propertyInfo == null) { continue; } var type = fieldInfo != null ? fieldInfo.FieldType : propertyInfo.PropertyType; object value = fieldInfo != null ? fieldInfo.GetValue(element) : propertyInfo.GetValue(element, null); if (type.IsValueType || type == typeof(string)) { Write("{0}: {1}", memberInfo.Name, FormatValue(value)); } else { var isEnumerable = typeof(IEnumerable).IsAssignableFrom(type); Write("{0}: {1}", memberInfo.Name, isEnumerable ? "..." : "{ }"); var alreadyTouched = !isEnumerable && AlreadyTouched(value); _level++; if (!alreadyTouched) { DumpElement(value, depth); } else { Write("{{{0}}} <-- bidirectional reference found", value.GetType().FullName); } _level--; } } } if (!typeof(IEnumerable).IsAssignableFrom(objectType)) { _level--; } } } catch (TargetParameterCountException e) { Log.Error($"ObjectDumper failed - TargetParameterCountException\n{e}"); } return(_stringBuilder.ToString()); }