コード例 #1
0
        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.");
                }
            }
        }