/// <summary>
        /// Choose the constructor to call for the given type.
        /// </summary>
        /// <param name="context">Current build context</param>
        /// <param name="resolverPolicyDestination">The <see cref='IPolicyList'/> to add any
        /// generated resolver objects into.</param>
        /// <returns>The chosen constructor.</returns>
        public SelectedConstructor SelectConstructor(IBuilderContext context, IPolicyList resolverPolicyDestination)
        {
            SelectedConstructor result;

            var typeInfo = (context ?? throw new ArgumentNullException(nameof(context))).BuildKey
                           .Type
                           .GetTypeInfo();
            var methodHasOpenGenericParameters = _ctor.GetParameters()
                                                 .Select(p => p.ParameterType.GetTypeInfo())
                                                 .Any(i => i.IsGenericType && i.ContainsGenericParameters);

            var ctorTypeInfo = _ctor.DeclaringType.GetTypeInfo();

            if (!methodHasOpenGenericParameters && !(ctorTypeInfo.IsGenericType && ctorTypeInfo.ContainsGenericParameters))
            {
                result = new SelectedConstructor(_ctor);
            }
            else
            {
                var closedCtorParameterTypes = _ctor.GetClosedParameterTypes(typeInfo.GenericTypeArguments);

                var constructor = typeInfo.DeclaredConstructors
                                  .Single(c => !c.IsStatic && c.GetParameters().ParametersMatch(closedCtorParameterTypes));

                result = new SelectedConstructor(constructor);
            }

            foreach (var parameterValue in _parameterValues)
            {
                var resolver = parameterValue.GetResolverPolicy(context.BuildKey.Type);
                result.AddParameterResolver(resolver);
            }

            return(result);
        }