public virtual void ExpandMembers(bool showControls, bool showFields, bool showProperties) { if (Object == null) { return; } Nodes.Clear(); if (ObjectType.BaseType != null && (ObjectType.BaseType != typeof(object) && ObjectType.BaseType != typeof(System.ValueType))) { MemberNode n = new MemberNode("(base)", "", ObjectType.BaseType) { ObjectType = ObjectType.BaseType, Object = Object, Member = null }; n.ImageId = (int)IconEnum.PublicField; if (CanExpandNodeWithType(n.ObjectType)) { n.HasChildren = true; } Nodes.Add(n); } var events = ObjectType.GetEventsOfType(true, false); if (events.Count > 0) { MemberNode n = new MemberNode("(all wired events)", "", ObjectType) { ObjectType = ObjectType, Object = Object, Member = null }; n.ImageId = (int)IconEnum.PublicEvent; foreach (var ev in events) { EventNode eventNode = new EventNode(ev, Object); eventNode.ExpandMembers(); // add if has wired events if (eventNode.Nodes.Count > 0) { n.Nodes.Add(eventNode); } } Nodes.Add(n); } if (ObjectType != typeof(string)) { try { object[] array = LocalsHelper.AsObjectArrayFromIenumerable(Object); if (array != null) { AddIEnumerableNodes(array); } //var ienumerableInterface = ObjectType.GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>)).FirstOrDefault(); //if (ienumerableInterface != null) //{ // object[] items = LocalsHelper.AsObjectArrayFromGenericIenumerable(Object); // AddIEnumerableNodes(items); //} //else //{ // var ienumerableNonGenericInterface = ObjectType.GetInterfaces().Where(i => i.IsAssignableFrom(typeof(IEnumerable))).FirstOrDefault(); // if (ienumerableInterface != null) // { // object[] items = LocalsHelper.AsObjectArrayFromIenumerable(Object); // AddIEnumerableNodes(items); // } // else // { // var icollection = ObjectType.GetInterfaces().Where(i => i.IsAssignableFrom(typeof(ICollection))).FirstOrDefault(); // if (icollection != null) // { // object[] items = LocalsHelper.AsObjectArrayFromIenumerable(Object); // AddIEnumerableNodes(items); // } // } //} } catch (Exception) { } } foreach (var f in ObjectType.GetFieldsOfType(false, false) .OrderBy(f => f.Name)) { if (!f.Name.Contains(">k__BackingField")) { MemberNode n = new MemberNode(f); AddNode(this, n, showControls, showFields, showProperties); } } foreach (var p in ObjectType.GetPropertiesOfType(false, true) .Where(p => p.GetIndexParameters().Length <= 0) .OrderBy(p => p.Name)) { MemberNode n = new MemberNode(p); AddNode(this, n, showControls, showFields, showProperties); } foreach (var ev in ObjectType.GetEventsOfType(false, true) .OrderBy(e => e.Name)) { EventNode n = new EventNode(ev, null); this.Nodes.Add(n); n.ExpandMembers(); } if (Nodes.Count <= 0) { HasChildren = false; } }
public LocalsWindow(string thisName, object obj) { this.thisObject = obj; InitializeComponent(); if (!string.IsNullOrEmpty(thisName)) { Text = "Locals & Watches - " + thisName; } tree.Columns.Add(new TreeListColumn("Name", "Name") { AutoSize = true }); var valueCol = new TreeListColumn("Value", "Value") { AutoSize = true }; valueCol.CellFormatConditions = new RunTimeDebuggers.Controls.TreeList.ConditionalFormatting[] { new RunTimeDebuggers.Controls.TreeList.ConditionalFormatting(n => n is ILocalsNode && ((ILocalsNode)n).Changed, new RunTimeDebuggers.Controls.TreeList.TextFormatting(valueCol.CellFormat) { ForeColor = Color.Red }) }; tree.Columns.Add(valueCol); tree.Columns.Add(new TreeListColumn("Type", "Type") { AutoSize = true }); FillImageListForMemberIcons(imgs); tree.Images = imgs; if (obj != null) { rootNode = new MemberNode(thisName + " (this)", obj, obj == null ? null : obj.GetType().ToSignatureString()) { Object = obj, ObjectType = obj.GetType(), Member = null }; rootNode.HasChildren = true; rootNode.ImageId = (int)IconEnum.PublicField; rootNode.ExpandMembers(btnShowControls.Checked, btnShowFields.Checked, btnShowProperties.Checked); rootNode.Expand(); tree.Nodes.Add(rootNode); } tree.RowOptions.ShowHeader = false; tree.NotifyBeforeExpand += new TreeListView.NotifyBeforeExpandHandler(tree_NotifyBeforeExpand); exprBox = new ExpressionBox(obj); exprBox.ExpressionEvaluated += new ExpressionBox.ExpressionEvaluatedHandler(exprBox_ExpressionEvaluated); exprBox.Dock = DockStyle.Fill; pnl.Controls.Add(exprBox); FillControlTree(); }