/// <summary> /// A generic function for merging a list from the different adapters. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="listType"></param> /// <returns></returns> private IList <T> GetMergedList <T>(AdapterListType listType) { int numberOfItems = 0; //Get the combined count of the different lists to allocate list capacity foreach (IRuleBaseAdapter adapter in m_Adapters) { adapter.Binder = m_Binder; numberOfItems += GetAdaptersList <T>(adapter, listType).Count; } //create the merged lists var mergedFacts = new List <T>(numberOfItems); //for each adapter merge the lists foreach (IRuleBaseAdapter adapter in m_Adapters) { mergedFacts.AddRange(GetAdaptersList <T>(adapter, listType)); } //Assign the merged lists return(mergedFacts.AsReadOnly()); }
/// <summary> /// Get a specific list type from an adapter. /// </summary> /// <typeparam name="T">Type of the list to return</typeparam> /// <param name="adapter">adapter to return the list from</param> /// <param name="listType"></param> /// <returns></returns> private IList <T> GetAdaptersList <T>(IRuleBaseAdapter adapter, AdapterListType listType) { switch (listType) { case AdapterListType.Fact: return((IList <T>)adapter.Facts); case AdapterListType.Implication: return((IList <T>)adapter.Implications); case AdapterListType.Query: return((IList <T>)adapter.Queries); } IExtendedRuleBaseAdapter extendedAdapter = adapter as IExtendedRuleBaseAdapter; if (adapter != null) { switch (listType) { case AdapterListType.Retraction: return((IList <T>)extendedAdapter.Retractions); case AdapterListType.IntegrityQuery: return((IList <T>)extendedAdapter.IntegrityQueries); case AdapterListType.Equivalent: return((IList <T>)extendedAdapter.Equivalents); case AdapterListType.Assertion: return((IList <T>)extendedAdapter.Assertions); } } return(new List <T>(0)); }
/// <summary> /// Get a specific list type from an adapter. /// </summary> /// <typeparam name="T">Type of the list to return</typeparam> /// <param name="adapter">adapter to return the list from</param> /// <param name="listType"></param> /// <returns></returns> private IList <T> GetAdaptersList <T>(IRuleBaseAdapter adapter, AdapterListType listType) { switch (listType) { case AdapterListType.Fact: return((IList <T>)adapter.Facts); case AdapterListType.Implication: return((IList <T>)adapter.Implications); case AdapterListType.Query: return((IList <T>)adapter.Queries); case AdapterListType.Assertion: break; case AdapterListType.Retraction: break; case AdapterListType.Equivalent: break; case AdapterListType.IntegrityQuery: break; default: throw new ArgumentOutOfRangeException(nameof(listType), listType, null); } var extendedAdapter = adapter as IExtendedRuleBaseAdapter; if (adapter == null) { return(new List <T>(0)); } switch (listType) { case AdapterListType.Retraction: return((IList <T>)extendedAdapter.Retractions); case AdapterListType.IntegrityQuery: return((IList <T>)extendedAdapter.IntegrityQueries); case AdapterListType.Equivalent: return((IList <T>)extendedAdapter.Equivalents); case AdapterListType.Assertion: return((IList <T>)extendedAdapter.Assertions); case AdapterListType.Fact: break; case AdapterListType.Query: break; case AdapterListType.Implication: break; default: throw new ArgumentOutOfRangeException(nameof(listType), listType, null); } return(new List <T>(0)); }