public static IEnumerable<TreeNode> LazyGetChildNodesOfObject(Expression targetObject, DebugType shownType) { MemberInfo[] publicStatic = shownType.GetFieldsAndNonIndexedProperties(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly); MemberInfo[] publicInstance = shownType.GetFieldsAndNonIndexedProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); MemberInfo[] nonPublicStatic = shownType.GetFieldsAndNonIndexedProperties(BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.DeclaredOnly); MemberInfo[] nonPublicInstance = shownType.GetFieldsAndNonIndexedProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly); DebugType baseType = (DebugType)shownType.BaseType; if (baseType != null) { yield return new TreeNode( ImageService.GetImage("Icons.16x16.Class"), "BaseClass", baseType.Name, baseType.FullName, baseType.FullName == "System.Object" ? null : Utils.LazyGetChildNodesOfObject(targetObject, baseType) ); } if (nonPublicInstance.Length > 0) { yield return new TreeNode( null, "NonPublicMembers", string.Empty, string.Empty, Utils.LazyGetMembersOfObject(targetObject, nonPublicInstance) ); } if (publicStatic.Length > 0 || nonPublicStatic.Length > 0) { IEnumerable<TreeNode> childs = Utils.LazyGetMembersOfObject(targetObject, publicStatic); if (nonPublicStatic.Length > 0) { TreeNode nonPublicStaticNode = new TreeNode( null, "NonPublicStaticMembers", string.Empty, string.Empty, Utils.LazyGetMembersOfObject(targetObject, nonPublicStatic) ); childs = Utils.PrependNode(nonPublicStaticNode, childs); } yield return new TreeNode( null, "StaticMembers", string.Empty, string.Empty, childs ); } DebugType iListType = (DebugType)shownType.GetInterface(typeof(IList).FullName); if (iListType != null) { yield return new IListNode(targetObject); } else { DebugType iEnumerableType, itemType; if (shownType.ResolveIEnumerableImplementation(out iEnumerableType, out itemType)) { yield return new IEnumerableNode(targetObject, itemType); } } foreach(TreeNode node in LazyGetMembersOfObject(targetObject, publicInstance)) { yield return node; } }
public static IEnumerable<TreeNode> PrependNode(TreeNode node, IEnumerable<TreeNode> rest) { yield return node; if (rest != null) { foreach(TreeNode absNode in rest) { yield return absNode; } } }