private static IFieldData GetFieldData(IClrTypeDecorator type, ulong objRef, ClrInstanceFieldDecorator fieldRef, bool interior, string fieldName) { ulong address = GetAddress(objRef, fieldRef, interior); IClrTypeDecorator fieldType = GetFieldType(type, fieldRef, address); string fieldValue = GetFieldValue(objRef, fieldRef, interior, address, fieldType); return new FieldData { Name = fieldName, ReferenceObject = GetReferenceObjectFactory(fieldType, address, fieldValue, false) }; }
private static string GetFieldValue(ulong objRef, ClrInstanceFieldDecorator fieldRef, bool interior, ulong address, IClrTypeDecorator fieldType) { string fieldValue = string.Empty; if (fieldRef.HasSimpleValue) { fieldValue = GetValueTypeValue(objRef, fieldRef, interior); } if (fieldRef.IsObjectAndNotString && address != Null && fieldType.HasSimpleValue) { fieldValue = GetBoxedValueTypeValue(fieldType, address); } return fieldValue; }
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 static IClrTypeDecorator GetFieldType(IClrTypeDecorator type, ClrInstanceFieldDecorator fieldRef, ulong address) { IClrTypeDecorator fieldType = fieldRef.Type; if (address != Null && fieldRef.IsObjectAndNotString) { fieldType = type.Heap.GetObjectType(address); } return fieldType; }
private static string GetBoxedValueTypeValue(IClrTypeDecorator fieldType, ulong address) { string fieldValue = string.Empty; object value = fieldType.GetValue(address); if (value != null) { fieldValue = value.ToString(); } return fieldValue; }