public static IClrObjMappingModel EnumerateList(ClrObject clrObject, ModelMapperFactory factory) { var result = new ArrayMappingModel { Obj = clrObject }; ClrObject fld = clrObject.GetRefFld("_items"); if (fld.Type == null) { return(result); } ClrType tp = fld.Type.ComponentType; if ((!tp.IsValueClass) && (!tp.IsString)) { // TODO: add support of reading strings. List <ClrObject> enumeration = ClrCollectionHelper.EnumerateListOfRefTypes(clrObject); foreach (ClrObject o in enumeration) { IClrObjMappingModel model = factory.BuildModel(o); result.Elements.Add(model); } } return(result); }
public override IClrObjMappingModel ReadEntity(ClrObject obj, ModelMapperFactory factory) { var field = obj.GetRefFld("_data"); IClrObjMappingModel safeDictionary; if (!factory.CollectionEnumerator.TryProcessSpecialCollection(field, out safeDictionary)) { return(null); } var casted = safeDictionary as HashtableMappingModel; if (casted == null) { return(null); } var model = new ArrayMappingModel(); foreach (IClrObjMappingModel key in casted.Elements.Keys) { model.AddElement(key); } return(model); }
protected ArrayMappingModel ReadArray([ClrObjAndTypeNotEmpty] ClrObject clrObject, [NotNull] ModelMapperFactory factory) { var result = new ArrayMappingModel { Obj = clrObject }; ClrObject[] arrayContent = this.EnumerationHelper.DoEnumerateArrayType(clrObject); if (arrayContent != null) { foreach (ClrObject o in arrayContent) { o.ReEvaluateType(); IClrObjMappingModel nested = factory.BuildModel(o); result.Elements.Add(nested); } } return(result); }
public override IClrObjMappingModel ReadEntity(ClrObject set, ModelMapperFactory factory) { var heap = set.Type.Heap; ClrObject container = set.GetRefFld("container"); var m_bucketsArray = container.GetRefFld("m_tables").GetRefFld("m_buckets"); var totalElements = m_bucketsArray.Type.GetArrayLength(m_bucketsArray.Address); var result = new ArrayMappingModel { Obj = set }; for (int i = 0; i < totalElements; i++) { var nodeAddress = (ulong)m_bucketsArray.Type.GetArrayElementValue(m_bucketsArray.Address, i); if (nodeAddress == 0) { continue; } var type = heap.GetObjectType(nodeAddress); if (type == null) { continue; } var node = new ClrObject(nodeAddress, type); var key = node.GetRefFld("m_key"); if (!key.IsNullObj) { result.AddElement(factory.BuildModel(key)); } } return(result); }