protected virtual TObjectUnit VisitRoot(Type type, bool allowAddToQueue = true) { var rootUnit = RootObjUnit ?? NewObjectUnit(); rootUnit.ObjType = type; RootObjUnit = rootUnit; if (allowAddToQueue) { ObjUnitsQueue.Enqueue(rootUnit); } return(rootUnit); }
protected virtual TObjectUnit VisitChild(TObjectUnit currentUnit, PropertyInfo propInfo, bool allowAddToQueue = true) { var subUnit = NewObjectUnit(); subUnit.ObjType = propInfo.PropertyType; subUnit.Level = currentUnit.Level + 1; currentUnit.SubUnits.Add(subUnit); if (allowAddToQueue && subUnit.ObjType != typeof(string) && !subUnit.ObjType.GetTypeInfo().IsPrimitive && !subUnit.ObjType.GetTypeInfo().IsValueType) { ObjUnitsQueue.Enqueue(subUnit); } return(subUnit); }
protected virtual IEnumerable <TObjectUnit> VisitRootChilds() { while (ObjUnitsQueue.Count > 0) { var currentUnit = ObjUnitsQueue.Dequeue(); var type = currentUnit.ObjType; var typeInfo = type.GetTypeInfo(); var properties = ExtractTypeProperties(type); properties = properties.Where(PropertyFilter); foreach (var propInfo in properties) { VisitChild(currentUnit, propInfo); } } return(RootObjUnit.SubUnits.Cast <TObjectUnit>()); }