in src/React.Core/TinyIoC/TinyIoC.cs [3995:4062]
private object ConstructType(Type requestedType, Type implementationType, ConstructorInfo constructor, NamedParameterOverloads parameters, ResolveOptions options)
{
var typeToConstruct = implementationType;
#if RESOLVE_OPEN_GENERICS
if (implementationType.IsGenericTypeDefinition())
{
if (requestedType == null || !requestedType.IsGenericType() || !requestedType.GetGenericArguments().Any())
throw new TinyIoCResolutionException(typeToConstruct);
typeToConstruct = typeToConstruct.MakeGenericType(requestedType.GetGenericArguments());
}
#endif
if (constructor == null)
{
// Try and get the best constructor that we can construct
// if we can't construct any then get the constructor
// with the least number of parameters so we can throw a meaningful
// resolve exception
constructor = GetBestConstructor(typeToConstruct, parameters, options) ?? GetTypeConstructors(typeToConstruct).LastOrDefault();
}
if (constructor == null)
throw new TinyIoCResolutionException(typeToConstruct);
var ctorParams = constructor.GetParameters();
object[] args = new object[ctorParams.Count()];
for (int parameterIndex = 0; parameterIndex < ctorParams.Count(); parameterIndex++)
{
var currentParam = ctorParams[parameterIndex];
try
{
args[parameterIndex] = parameters.ContainsKey(currentParam.Name) ?
parameters[currentParam.Name] :
ResolveInternal(
new TypeRegistration(currentParam.ParameterType),
NamedParameterOverloads.Default,
options);
}
catch (TinyIoCResolutionException ex)
{
// If a constructor parameter can't be resolved
// it will throw, so wrap it and throw that this can't
// be resolved.
throw new TinyIoCResolutionException(typeToConstruct, ex);
}
catch (Exception ex)
{
throw new TinyIoCResolutionException(typeToConstruct, ex);
}
}
try
{
#if USE_OBJECT_CONSTRUCTOR
var constructionDelegate = CreateObjectConstructionDelegateWithCache(constructor);
return constructionDelegate.Invoke(args);
#else
return constructor.Invoke(args);
#endif
}
catch (Exception ex)
{
throw new TinyIoCResolutionException(typeToConstruct, ex);
}
}