private static MultiElementDictionary<string, Func<IFieldData>> GetObjectFields(IClrTypeDecorator type, ulong objRef, bool isInterior) { var objectFields = new MultiElementDictionary<string, Func<IFieldData>>(); bool interior = !type.IsObjectReference; if (isInterior) { interior = false; } foreach (var field in type.Fields) { string fieldName = field.Name; ClrInstanceFieldDecorator fieldRef = field; objectFields.Add(fieldName, () => GetFieldData(type, objRef, fieldRef, interior, fieldName)); } return objectFields; }
private IEnumerable<ITypeNode> GetTypeHierarchy(IEnumerable<string> names, uint level) { var nextLevelElements = new MultiElementDictionary<string, string>(); foreach (string name in names) { var type = name; if (type.IsLastSubNamespace(level) || type.IsLastSubNamespace(0)) { yield return new TypeLeaf { Name = name, Instances = GetHeapObjects(name) }; } else { nextLevelElements.Add(name.GetSubNamespace(level), name); } } foreach (var keyValuePair in nextLevelElements.GetDictionary()) { yield return GetTypeHierarchy(level, keyValuePair.Key, keyValuePair.Value); } }