/// <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); }