コード例 #1
0
        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("}");
        }