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);
                        }
                    }
                }
            }
        }