public void GetParameterDefaultValues_ReturnsExpectedValues(string methodName, object[] expectedValues)
        {
            // Arrange
            var methodInfo = typeof(TestObject).GetMethod(methodName);

            // Act
            var actualValues = ParameterDefaultValues.GetParameterDefaultValues(methodInfo);

            // Assert
            Assert.Equal(expectedValues, actualValues);
        }
        public void GetParameterDefaultValues_ReturnsExpectedValues_ForStructTypes()
        {
            // Arrange
            var methodInfo = typeof(TestObject).GetMethod("DefaultValuesOfStructTypes");

            // Act
            var actualValues = ParameterDefaultValues.GetParameterDefaultValues(methodInfo);

            // Assert
            Assert.Equal(
                new object[] { default(Guid), default(TimeSpan), default(DateTime), default(DateTimeOffset) },
                actualValues);
        }
        public (ControllerActionInvokerCacheEntry cacheEntry, IFilterMetadata[] filters) GetCachedResult(ControllerContext controllerContext)
        {
            var actionDescriptor = controllerContext.ActionDescriptor;

            IFilterMetadata[] filters;

            var cacheEntry = actionDescriptor.CacheEntry;

            // We don't care about thread safety here
            if (cacheEntry is null)
            {
                var filterFactoryResult = FilterFactory.GetAllFilters(_filterProviders, controllerContext);
                filters = filterFactoryResult.Filters;

                var parameterDefaultValues = ParameterDefaultValues
                                             .GetParameterDefaultValues(actionDescriptor.MethodInfo);

                var objectMethodExecutor = ObjectMethodExecutor.Create(
                    actionDescriptor.MethodInfo,
                    actionDescriptor.ControllerTypeInfo,
                    parameterDefaultValues);

                var controllerFactory     = _controllerFactoryProvider.CreateControllerFactory(actionDescriptor);
                var controllerReleaser    = _controllerFactoryProvider.CreateControllerReleaser(actionDescriptor);
                var propertyBinderFactory = ControllerBinderDelegateProvider.CreateBinderDelegate(
                    _parameterBinder,
                    _modelBinderFactory,
                    _modelMetadataProvider,
                    actionDescriptor,
                    _mvcOptions);

                var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);

                cacheEntry = new ControllerActionInvokerCacheEntry(
                    filterFactoryResult.CacheableFilters,
                    controllerFactory,
                    controllerReleaser,
                    propertyBinderFactory,
                    objectMethodExecutor,
                    actionMethodExecutor);

                actionDescriptor.CacheEntry = cacheEntry;
            }
            else
            {
                // Filter instances from statically defined filter descriptors + from filter providers
                filters = FilterFactory.CreateUncachedFilters(_filterProviders, controllerContext, cacheEntry.CachedFilters);
            }

            return(cacheEntry, filters);
        }