/// <summary>
        /// Register a delegate
        /// </summary>
        /// <param name="currentApi"></param>
        /// <param name="instanceConfiguration"></param>
        /// <param name="delegate"></param>
        protected virtual void RegisterDelegate(ICurrentApiInformation currentApi, BaseDelegateInstanceConfiguration instanceConfiguration, Delegate @delegate)
        {
            foreach (var configuration in CreateEndPointMethodConfigurationForDelegate(currentApi, instanceConfiguration, @delegate))
            {
                var endPointMethodHandler = CreateEndPointMethodHandler(currentApi, configuration);

                _handlers.Add(endPointMethodHandler);
            }
        }
        /// <summary>
        /// Create endpoints for a delegate
        /// </summary>
        /// <param name="currentApi"></param>
        /// <param name="instanceConfiguration"></param>
        /// <param name="func"></param>
        /// <returns></returns>
        protected virtual IEnumerable <EndPointMethodConfiguration> CreateEndPointMethodConfigurationForDelegate(ICurrentApiInformation currentApi, BaseDelegateInstanceConfiguration instanceConfiguration, Delegate func)
        {
            var fullPath   = instanceConfiguration.Path;
            var funcMethod = func.Method;

            var routeList = GenerateRouteInformationList(fullPath,
                                                         instanceConfiguration.Method,
                                                         GetDefaultRequestBody(instanceConfiguration.Method, instanceConfiguration.HasRequestBody),
                                                         currentApi,
                                                         typeof(object),
                                                         "",
                                                         funcMethod,
                                                         new List <Attribute>());

            foreach (var routeInformation in routeList)
            {
                var configuration = new EndPointMethodConfiguration(routeInformation, context => null,
                                                                    new MethodInvokeInformation {
                    DelegateToInvoke = func
                }, funcMethod.ReturnType);

                var parameters = GenerateMethodParameters(null, funcMethod, routeInformation);

                configuration.Parameters.AddRange(parameters);

                configuration.RawContentType = instanceConfiguration.RawContentType;

                SetStatusAndResponseBodyConfigValues(configuration, instanceConfiguration.HasResponseBody,
                                                     instanceConfiguration.SuccessStatusCode);

                if (string.IsNullOrEmpty(configuration.RawContentType))
                {
                    var returnType = funcMethod.ReturnType;

                    if (returnType.IsConstructedGenericType &&
                        (returnType.GetGenericTypeDefinition() == typeof(Task <>) ||
                         returnType.GetGenericTypeDefinition() == typeof(ValueTask <>)))
                    {
                        returnType = returnType.GenericTypeArguments[0];
                    }

                    if (_exposeConfigurations.TypeWrapSelector(returnType))
                    {
                        configuration.WrappedType = _wrappedResultTypeCreator.GetTypeWrapper(returnType);
                    }
                }

                if (currentApi.Headers != ImmutableLinkedList <IResponseHeader> .Empty ||
                    instanceConfiguration.Headers != ImmutableLinkedList <IResponseHeader> .Empty)
                {
                    var responseHeaders = new List <IResponseHeader>();

                    responseHeaders.AddRange(currentApi.Headers);
                    responseHeaders.AddRange(instanceConfiguration.Headers);

                    configuration.ResponseHeaders = responseHeaders;
                }

                ApplyAuthorizations(currentApi, null, configuration, EmptyList, EmptyList);

                ApplyFilters(currentApi, GetFilterList(currentApi, configuration, EmptyList, EmptyList), configuration);

                if (_supportCompression)
                {
                    configuration.SupportsCompression = _compressionSelectorService.ShouldCompressResult(configuration);
                }

                yield return(configuration);
            }
        }