private bool CanConstructorBeUsed(ConstructorInfo constructor, object tag, bool autoCompleteDependencies, params object[] parameters)
{
Log.Debug("Checking if constructor '{0}' can be used", constructor.GetSignature());
if (constructor.IsStatic)
{
Log.Debug("Constructor is not valid because it is static");
return false;
}
bool validConstructor = true;
var ctorParameters = constructor.GetParameters();
for (int i = 0; i < parameters.Length; i++)
{
var ctorParameter = ctorParameters[i];
var ctorParameterType = ctorParameter.ParameterType;
if (!IsValidParameterValue(ctorParameterType, parameters[i]))
{
Log.Debug("Constructor is not valid because value '{0}' cannot be used for parameter '{0}'",
ObjectToStringHelper.ToString(parameters[i]), ctorParameter.Name);
validConstructor = false;
break;
}
}
if (validConstructor && autoCompleteDependencies)
{
if (ctorParameters.Length > parameters.Length)
{
// check if all the additional parameters are registered in the service locator
for (int j = parameters.Length; j < ctorParameters.Length; j++)
{
var parameterToResolve = ctorParameters[j];
var parameterTypeToResolve = parameterToResolve.ParameterType;
if (!_serviceLocator.IsTypeRegistered(parameterTypeToResolve))
{
Log.Debug("Constructor is not valid because parameter '{0}' cannot be resolved from the dependency resolver", parameterToResolve.Name);
validConstructor = false;
break;
}
}
}
}
Log.Debug("The constructor is valid and can be used");
return validConstructor;
}