public Injector <T> Parse <T>(Kernel kernel, ObjectDescription description, out List <DependencyProvider> groupDepProviders)
        {
            var ctorConfigItem   = _configGroup.ConstructorInjectionConfigurationItem;
            var ctorDepProviders = ctorConfigItem.CreateDependencyProviders(kernel, description, true);

            InjectorEmitBody emitBody;
            Type             injectorType;
            ConstructorInfo  injectorTypeConstructor;
            Injector <T>     injector;

            var ctorEmitBody      = new ConstructorEmitBody(kernel.EmitInjectorManager, ctorConfigItem.Constructor, ctorDepProviders);
            var memberConfigItems = _configGroup.MemberInjectionConfigurationItems;

            if (memberConfigItems == null)
            {
                emitBody                = new InjectorEmitBody(description.ContractType, ctorEmitBody, null);
                injectorType            = BuildDynamicInjectorType(kernel, emitBody);
                injectorTypeConstructor = GetConstructorOfDynamicInjectorType(injectorType, ctorDepProviders, null);
                injector                = CreateDynamicInjector <T>(injectorTypeConstructor, ctorDepProviders, null);
                groupDepProviders       = ctorDepProviders == null ? null : new List <DependencyProvider>(ctorDepProviders);
                return(injector);
            }

            List <DependencyProvider> allMemberDepProviders = null;
            var methodEmitBodySet = new MethodEmitBody[memberConfigItems.Count];

            for (int i = 0; i < memberConfigItems.Count; i++)
            {
                var memberConfigItem   = memberConfigItems[i];
                var memberDepProviders = memberConfigItem.CreateDependencyProviders(kernel, description, true);
                if (memberDepProviders == null)
                {
                    if (memberConfigItem.MemberKind == MemberKind.Property)
                    {
                        throw new ImpossibleException();
                    }
                    methodEmitBodySet[i] = new MethodEmitBody(memberConfigItem.InjectionMethod, null);
                    continue;
                }

                if (allMemberDepProviders == null)
                {
                    allMemberDepProviders = new List <DependencyProvider>();
                }
                allMemberDepProviders.AddRange(memberDepProviders);

                var paramEmitBodySet = new ParameterEmitBody[memberDepProviders.Length];
                for (int j = 0; j < memberDepProviders.Length; j++)
                {
                    paramEmitBodySet[j] = new ParameterEmitBody(memberDepProviders[j]);
                }

                methodEmitBodySet[i] = new MethodEmitBody(memberConfigItem.InjectionMethod, paramEmitBodySet);
            }

            emitBody                = new InjectorEmitBody(description.ContractType, ctorEmitBody, methodEmitBodySet);
            injectorType            = BuildDynamicInjectorType(kernel, emitBody);
            injectorTypeConstructor = GetConstructorOfDynamicInjectorType(injectorType, ctorDepProviders, allMemberDepProviders);
            injector                = CreateDynamicInjector <T>(injectorTypeConstructor, ctorDepProviders, allMemberDepProviders);

            groupDepProviders = ctorDepProviders == null ? null : new List <DependencyProvider>(ctorDepProviders);
            if (groupDepProviders == null)
            {
                if (allMemberDepProviders != null)
                {
                    groupDepProviders = allMemberDepProviders;
                }
            }
            else
            {
                if (allMemberDepProviders != null)
                {
                    groupDepProviders.AddRange(allMemberDepProviders);
                }
            }
            return(injector);
        }
        static Type BuildDynamicInjectorType(Kernel kernel, InjectorEmitBody emitBody)
        {
            var injectorManager = kernel.EmitInjectorManager;

            return(injectorManager.GetOrCreateInjectorType(emitBody));
        }