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); }
internal ResultObject(object?o, DumpQuotas quotas, string?header = null, MemberInfo?member = null) { _quotas = quotas; _member = member; IsExpanded = quotas.MaxExpandedDepth > 0; Initialize(o, header); }
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); }
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) }; } }
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; } } }
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(); }
public DumpData(object?o, string?header, DumpQuotas quotas) { Object = o; Header = header; Quotas = quotas; }
public static ResultObject Create(object?o, DumpQuotas quotas, string?header = null) { return(new ResultObject(o, quotas, header)); }