private ICollection <object> GetChildren( object oObj, ChildrenListFilter pfChildrenListFilter, object oChildrenListFilterCriteria, ObjectFilter pfObjectFilter, object oObjectFilterCriteria, EntityRelation enRelation, bool bRecursive) { const int INITIAL_CHILDREN_ARRAY = 100; ICollection <object> oChildren = new List <object>(INITIAL_CHILDREN_ARRAY); GetChildren( oObj, pfChildrenListFilter, oChildrenListFilterCriteria, pfObjectFilter, oObjectFilterCriteria, enRelation, bRecursive, oChildren // "Out", will be filled ); return(oChildren); }
// Avoids reallocation of returned children ArrayList private void GetChildren( object oObj, ChildrenListFilter pfChildrenListFilter, object oChildrenListFilterCriteria, ObjectFilter pfObjectFilter, object oObjectFilterCriteria, EntityRelation enRelation, bool bRecursive, ICollection <object> oOutChildren) { // Get TypeInfo of specified object EntityTypeInfo oEntityTypeInfo = GetEntityTypeInfo(oObj); // Get the ChildrenLists according to EntityRelation filter EntityChildrenListInfo[] ChildrenLists = GetChildrenListsInfo( oEntityTypeInfo, enRelation); // Iterate ChildrenLists foreach (EntityChildrenListInfo oChildrenList in ChildrenLists) { // Obtain list object INamedObjectList oContainer = oChildrenList.GetValue(oObj) as INamedObjectList; if (oContainer != null) { // Check if container passes filter bool bContainerPassedFilter = (pfChildrenListFilter == null) || pfChildrenListFilter(oChildrenList, oChildrenListFilterCriteria); object oEl; for (int i = 0; i < oContainer.Count; i++) { oEl = oContainer[oContainer.NameByIndex(i)]; if (bContainerPassedFilter && (pfObjectFilter == null || pfObjectFilter(oEl, oObjectFilterCriteria))) { // If elements filter passed oOutChildren.Add(oEl); } if (bRecursive) { // Recursive call for each children GetChildren( oEl, pfChildrenListFilter, oChildrenListFilterCriteria, pfObjectFilter, oObjectFilterCriteria, enRelation, bRecursive, oOutChildren); } } } } }