/// <inheritdoc /> public dynamic Create(int clauseNumber, FilterType filterType) { // Note the dynamic return type. COM Interop requires an object; // it cannot be the base class, because in that case COM Interop would only expose the base interface. // There is no way to solve this using MarshalAs as far as I know // However, we can sort of get away with using the 'dynamic' keyword. // .Net consumers will still need to cast the type. if (_filters.Count() == CommenceLimits.MaxFilters) { throw new ArgumentOutOfRangeException($"Maximum number of filters in use {CommenceLimits.MaxFilters}."); } if (clauseNumber < 1 || clauseNumber > 8) { throw new IndexOutOfRangeException($"Invalid clause number detected. Clause number must be between 1 and {CommenceLimits.MaxFilters}"); } switch (filterType) { case FilterType.Field: ICursorFilterTypeF f = new CursorFilterTypeF(clauseNumber); _filters.Add(f); return(f); case FilterType.ConnectionToCategoryField: ICursorFilterTypeCTCF ctcf = new CursorFilterTypeCTCF(clauseNumber); _filters.Add(ctcf); return(ctcf); case FilterType.ConnectionToItem: ICursorFilterTypeCTI cti = new CursorFilterTypeCTI(clauseNumber); _filters.Add(cti); return(cti); case FilterType.ConnectionToCategoryToItem: ICursorFilterTypeCTCTI ctcti = new CursorFilterTypeCTCTI(clauseNumber); _filters.Add(ctcti); return(ctcti); default: throw new ArgumentException($"{filterType} does not correspond to a known filter type."); } }