private static void DumpUserData(Script script, UserData data, int depth, int maxDepth) { var obj = data.Object; var type = data.Descriptor.Type; var originalType = type; if (obj == null) { Console.Write($"(Static {type.Name})"); return; } // If this is a proxy type, convert it obj = ProxyUtil.GetUserDataAsProxy(data); type = obj.GetType(); // Special cases if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ListProxy <>)) { DumpList(script, type, obj, depth, maxDepth); return; } if (type == typeof(StringIdProxy)) { Console.Write($"(StringId {obj})"); return; } if (type == typeof(UInt64Proxy)) { Console.Write($"(UInt64 {obj})"); return; } if (depth == maxDepth) { Console.Write(obj); return; } Console.Write($"{originalType.Name} {{"); // Enumerate over public fields and properties var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy); var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy); var first = true; foreach (var member in fields.Concat <MemberInfo>(properties)) { object val; switch (member.MemberType) { case MemberTypes.Field: val = ((FieldInfo)member).GetValue(obj); break; case MemberTypes.Property: var property = (PropertyInfo)member; if (property.GetMethod.GetParameters().Length > 0) { continue; // Ignore indexers, etc. } val = property.GetValue(obj); break; default: continue; } if (!first) { Console.WriteLine(","); } else { Console.WriteLine(); } first = false; Indent(depth + 1); Console.ForegroundColor = ConsoleColor.White; Console.Write(member.Name); Console.ForegroundColor = ConsoleColor.Gray; Console.Write(" = "); Dump(script, DynValue.FromObject(script, val), depth + 1, maxDepth); } Console.WriteLine(); Indent(depth); Console.Write("}"); }