private void ResolveConstructor() { IConstructorInfo constructor = null; ParameterInfo[] resolvedConstructorParameters = null; int seen = 0; foreach (KeyValuePair <ISlotInfo, object> slotValue in SlotValues) { IParameterInfo parameter = slotValue.Key as IParameterInfo; if (parameter != null) { IConstructorInfo possibleConstructor = parameter.Member as IConstructorInfo; if (possibleConstructor == null) { throw new ArgumentException(String.Format("The parameter slot '{0}' is not a constructor parameter.", parameter)); } if (constructor == null) { constructor = possibleConstructor; resolvedConstructor = ResolveMember(resolvedType, constructor.Resolve(true)); resolvedConstructorParameters = resolvedConstructor.GetParameters(); resolvedConstructorArguments = new object[resolvedConstructorParameters.Length]; } else { if (!constructor.Equals(possibleConstructor)) { throw new ArgumentException(String.Format("The parameter slot '{0}' belongs to a different constructor than the previous parameter slot.", parameter)); } } int position = parameter.Position; resolvedConstructorArguments[position] = Converter.Convert(slotValue.Value, resolvedConstructorParameters[position].ParameterType); seen += 1; } } if (resolvedConstructorParameters != null && resolvedConstructorParameters.Length != seen) { throw new ArgumentException(String.Format("The constructor has {0} parameters but the bindings only provide values for {1} of them.", resolvedConstructorParameters.Length, seen)); } if (constructor == null) { // Note: Value types don't have default constructors so we leave the constructor field null // to remember to instantiate the structure a different way. if (resolvedType.IsClass && !resolvedType.IsAbstract) { resolvedConstructor = resolvedType.GetConstructor(EmptyArray <Type> .Instance); if (resolvedConstructor == null) { throw new ArgumentException("The bindings do not contain any constructor parameters but the class does not have a default constructor."); } } resolvedConstructorArguments = EmptyArray <object> .Instance; } else { if (resolvedType.IsAbstract) { throw new ArgumentException("Parameters should not be specified for the constructor of an abstract type."); } } }