Exemple #1
0
        private void PopulateObject(object o, string headerPrefix, DumpQuotas targetQuotas)
        {
            if (o == null)
            {
                Header = headerPrefix;
                Value  = "<null>";
                return;
            }

            var isMaxDepth = _quotas.MaxDepth <= 0;

            SetType(o);

            if (o is string s)
            {
                Header = headerPrefix;
                Value  = s;
                return;
            }

            var type = o.GetType();

            var e = GetEnumerable(o, type);

            if (e != null)
            {
                if (isMaxDepth)
                {
                    InitializeEnumerableHeaderOnly(headerPrefix, e);
                }
                else
                {
                    var members = GetMembers(type);

                    // ReSharper disable once PossibleMultipleEnumeration
                    if (IsSpecialEnumerable(type, members))
                    {
                        // ReSharper disable once PossibleMultipleEnumeration
                        PopulateChildren(o, targetQuotas, members, headerPrefix);
                        var enumerable = new ResultObject(o, targetQuotas, headerPrefix);
                        enumerable.InitializeEnumerable(headerPrefix, e, targetQuotas);
                        Children = Children.Concat(new[] { enumerable }).ToList();
                    }
                    else
                    {
                        InitializeEnumerable(headerPrefix, e, targetQuotas);
                    }
                }
                return;
            }

            if (isMaxDepth)
            {
                Header = headerPrefix;
                Value  = GetString(o);
                return;
            }

            PopulateChildren(o, targetQuotas, GetMembers(type), headerPrefix);
        }
Exemple #2
0
 internal ResultObject(object o, DumpQuotas quotas, string header = null, MemberInfo member = null)
 {
     _quotas    = quotas;
     _member    = member;
     IsExpanded = quotas.MaxExpandedDepth > 0;
     Initialize(o, header);
 }
Exemple #3
0
        private bool TryPopulateMember(object o, DumpQuotas targetQuotas)
        {
            if (_member == null)
            {
                return(false);
            }

            object value;

            try
            {
                if (o is Exception exception)
                {
                    if (_member.Name == nameof(Exception.StackTrace))
                    {
                        value = GetStackTrace(exception);
                    }
                    else
                    {
                        value = GetMemberValue(o);

                        if (_member.Name == "TargetSite")
                        {
                            targetQuotas = targetQuotas.WithMaxDepth(0);
                        }
                    }
                }
                else
                {
                    value = GetMemberValue(o);
                }
            }
            catch (TargetInvocationException exception)
            {
                Header = _member.Name;
                // ReSharper disable once PossibleNullReferenceException
                Value    = $"Threw {exception.InnerException.GetType().Name}";
                Children = new List <ResultObject> {
                    ExceptionResultObject.Create(exception.InnerException, _quotas)
                };
                return(true);
            }

            if (value == null)
            {
                if (_member is PropertyInfo propertyInfo)
                {
                    SetType(propertyInfo.PropertyType);
                }
                else if (_member is FieldInfo fieldInfo)
                {
                    SetType(fieldInfo.FieldType);
                }
            }

            PopulateObject(value, _member.Name, targetQuotas);
            return(true);
        }
Exemple #4
0
        private void InitializeEnumerable(string headerPrefix, IEnumerable e, DumpQuotas targetQuotas)
        {
            try
            {
                Header = headerPrefix;

                var items = new List <ResultObject>();

                var type = e.GetType().GetTypeInfo();

                var enumerableInterface = type.ImplementedInterfaces
                                          .FirstOrDefault(x => x.IsConstructedGenericType && x.GetGenericTypeDefinition() == typeof(IEnumerable <>));
                var enumerableType     = enumerableInterface?.GenericTypeArguments[0] ?? typeof(object);
                var enumerableTypeName = GetTypeName(enumerableType);

                var enumerator = e.GetEnumerator();
                using (enumerator as IDisposable)
                {
                    var index = 0;
                    while (index < _quotas.MaxEnumerableLength && enumerator.MoveNext())
                    {
                        var item = new ResultObject(enumerator.Current, targetQuotas, $"[{index}]");
                        if (item.Type == null)
                        {
                            item.Type = enumerableTypeName;
                        }
                        items.Add(item);
                        ++index;
                    }

                    var hasMore           = enumerator.MoveNext() ? "+" : "";
                    var groupingInterface = type.ImplementedInterfaces
                                            .FirstOrDefault(x => x.IsConstructedGenericType &&
                                                            x.GetGenericTypeDefinition() == typeof(IGrouping <,>));
                    Value = groupingInterface != null
                        ? $"<grouping Count: {items.Count}{hasMore} Key: {groupingInterface.GetRuntimeProperty("Key").GetValue(e)}>"
                        : $"<enumerable Count: {items.Count}{hasMore}>";
                    Children = items;
                }
            }
            catch (Exception exception)
            {
                Header   = _member?.Name;
                Value    = $"Threw {exception.GetType().Name}";
                Children = new List <ResultObject> {
                    ExceptionResultObject.Create(exception, _quotas)
                };
            }
        }
Exemple #5
0
        private ExceptionResultObject(Exception exception, DumpQuotas quotas) : base(exception, quotas)
        {
            Message = exception.Message;

            var stackFrames = new StackTrace(exception, fNeedFileInfo: true).GetFrames() ?? Array.Empty <StackFrame>();

            foreach (var stackFrame in stackFrames)
            {
                if (IsScriptMethod(stackFrame))
                {
                    LineNumber = stackFrame.GetFileLineNumber();
                    break;
                }
            }
        }
Exemple #6
0
        private void PopulateChildren(object o, DumpQuotas targetQuotas, IEnumerable <MemberInfo> properties, string headerPrefix)
        {
            Header = headerPrefix;
            Value  = GetString(o);

            if (o == null)
            {
                return;
            }

            var children = properties
                           .Select(p => new ResultObject(o, targetQuotas, member: p));

            Children = children.ToList();
        }
Exemple #7
0
 public static ResultObject Create(object o, DumpQuotas quotas, string header = null)
 {
     return(new ResultObject(o, quotas, header));
 }
Exemple #8
0
 public DumpData(object?o, string?header, DumpQuotas quotas)
 {
     Object = o;
     Header = header;
     Quotas = quotas;
 }