Пример #1
0
        /// <summary>
        /// Builds a assignment info for the specified constructor.
        /// </summary>
        /// <param name="bindingAttr">A bit mask comprised of one or more <see cref="BindingFlags"/>
        /// that specify how the search is conducted.  -or- Zero, to return <c>null</c>.</param>
        /// <param name="constructor">The constructor to build the parameter assignment info's for.</param>
        /// <returns>
        /// An <see cref="AssignmentInfoCollection"/> initialized with the data from the specified
        /// <paramref name="constructor"/>.
        /// </returns>
        private AssignmentInfoCollection BuildAssignmentInfoForConstructor(
            BindingFlags bindingAttr, ConstructorInfo constructor)
        {
            // var ctorParameterTypesInterface = new List<ParameterInfo>();
            // var ctorParameterTypesStd = new List<ParameterInfo>();
            var ctorParameterTypes = new ParameterInfoCollection();
            var ctorParameters     = constructor.GetParameters();

            foreach (var para in ctorParameters)
            {
                {
                    // if (!para.ParameterType.IsGenericType)
                    ctorParameterTypes.AddParameterInfo(para);

                    /*if (para.ParameterType.IsInterface)
                     *                  {
                     *                      hasInterfaceInCtorParameters = true;
                     *                      ctorParameterTypesInterface.Add(para);
                     *                  }
                     *                  else
                     *                  {
                     *                      ctorParameterTypesStd.Add(para);
                     *                  }*/
                }
            }

            // BuildAssignmentInfoForConstructor
            var assignmentInfoCollection = new AssignmentInfoCollection {
                UsedConstructor = constructor
            };
            var addTypesFrom = ctorParameterTypes;

            /*var addTypesFrom = ctorParameterTypes.StandardTypes;
             *
             * // Todo: do not use bindingAttr here, use the MemberVisibility enumeration
             * if ((bindingAttr & BindingFlags.NonPublic) == BindingFlags.NonPublic)
             * {
             *  addTypesFrom = ctorParameterTypes;
             * }*/

            foreach (var paraInfo in addTypesFrom)
            {
                if (!paraInfo.ParameterType.IsGenericType)
                {
                    var memberField = CreateMemberField(paraInfo.ParameterType.FullName, paraInfo.Name);
                    // var fieldAssignment = CodeMethodComposer.CreateAndInitializeMemberField(
                    //    paraInfo.ParameterType, paraInfo.Name);
                    // var assignment = new ConstructorAssignment(
                    //    paraInfo.Name, fieldAssignment, memberField, paraInfo.ParameterType);
                    var fieldAssignment = CodeMethodComposer.CreateAndInitializeMemberField(
                        paraInfo.ParameterType, memberField.Name);
                    var assignment = new ConstructorAssignment(
                        memberField.Name, fieldAssignment, memberField, paraInfo.ParameterType);
                    assignmentInfoCollection.AddAssignment(assignment);
                }
                else
                {
                    var genericTypeDefinition = paraInfo.ParameterType.GetGenericTypeDefinition();

                    if (TestObjectMemberField.Type.BaseType == "DefaultMemberBuilderFactory")
                    {
                    }

                    if (CheckForItemizable(paraInfo, genericTypeDefinition))
                    {
                        var genArgs = paraInfo.ParameterType.GetGenericArguments();
                        if (genArgs.Length == 1)
                        {
                            var memberFieldName = paraInfo.Name + "Item";
                            var memberField     = CreateMemberField(genArgs[0].FullName, memberFieldName);
                            var fieldAssignment = CodeMethodComposer.CreateAndInitializeMemberField(
                                genArgs[0], memberField.Name);
                            var assignment = new ConstructorAssignment(
                                memberField.Name, fieldAssignment, memberField, genArgs[0]);

                            // assignmentInfoCollection.AddAssignment(assignment);
                            // AddAssignStatement(fieldAssignment);
                            var collectionFieldName  = paraInfo.Name;
                            var collectionField      = CreateMemberField(paraInfo.ParameterType.FullName, collectionFieldName);
                            var collectionAssignment = CodeMethodComposer.CreateAndInitializeCollectionField(
                                /*paraInfo.ParameterType,*/ collectionFieldName, memberFieldName);
                            var collection = new ConstructorAssignment(
                                collectionFieldName, collectionAssignment, collectionField, paraInfo.ParameterType);
                            collection.CreateAssignments.Add(assignment);
                            assignmentInfoCollection.AddAssignment(collection);
                        }
                    }

                    if (typeof(IEnumerable).IsAssignableFrom(paraInfo.ParameterType))
                    {
                    }

                    if (paraInfo.ParameterType.IsAssignableFrom(typeof(IEnumerable <>)))
                    {
                    }
                }
            }

            return(assignmentInfoCollection);
        }