public Task InvokeFiltersAsync <TContext, TFilter>(TContext context)
            where TContext : IFilterContext
            where TFilter : ICommandFilter
        {
            var filterType = typeof(TFilter);

            if (_cachedDelegates.TryGetValue(filterType, out var proccessDelegate))
            {
                return(proccessDelegate(context));
            }

            IFilterFactory selectedFilterFactory = null;

            foreach (var filterFactory in _filterFactories)
            {
                if (filterFactory.CanInvoke(filterType))
                {
                    selectedFilterFactory = filterFactory;
                    break;
                }
            }

            if (selectedFilterFactory.HasNoContent())
            {
                return(Task.CompletedTask);
            }

            var filterDelegate = selectedFilterFactory.GetFiltersDelegate();

            CheckFilterDelegate(selectedFilterFactory, filterDelegate);

            var buildedDelegate = BuildDelegate(filterType, filterDelegate);

            return(buildedDelegate(context));
        }