Esempio n. 1
0
        /// <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.");
            }
        }