Ejemplo n.º 1
0
        private static ConstructorCandidate SelectConstructor(MappedType type, ResolutionMap map, ConstructorParameter[] parameters)
        {
            var candidates                 = type.Candidates;
            var candidateCount             = candidates.Count;
            ConstructorCandidate candidate = null;

            for (int i = 0; i < candidateCount; i++)
            {
                candidate = candidates[i];
                var summaries    = candidate.Parameters;
                var summaryCount = summaries.Count;

                for (int j = 0; j < summaryCount; j++)
                {
                    var summary       = summaries[j];
                    var parameterType = summary.ParameterType;

                    if (!map.Contains(parameterType))
                    {
                        int parameterCount = parameters.Length;

                        for (int k = 0; k < parameterCount; k++)
                        {
                            var parameter = parameters[k];
                            if (parameterType.IsAssignableFrom(parameter.Value.GetType()))
                            {
                                return(candidate);
                            }
                        }
                    }
                    else
                    {
                        return(candidate);
                    }
                }
            }

            return(candidate);
        }
 public virtual void Register(Type to, MappedType mappedType, ResolutionMap resolutionMap)
 {
 }
        public void Register(Type to, MappedType mappedType, ResolutionMap resolutionMap)
        {
            if (activators.ContainsKey(to))
            {
                return;
            }

            var generator = new TypeGenerator.TypeGenerator();

            var candidates     = mappedType.Candidates;
            int candidateCount = candidates.Count;

            for (int candidateCounter = 0; candidateCounter < candidateCount; candidateCounter++)
            {
                var candidate = candidates[candidateCounter];
                if (activators.ContainsKey(candidate.Type))
                {
                    continue;
                }

                var activatorType = generator.CreateType(context =>
                {
                    context.Named(Guid.NewGuid() + "Builder");
                    context.InheritFrom <SiegeActivator>();

                    context.OverrideMethod <SiegeActivator>(activator => activator.Instantiate(null), method => method.WithBody(body =>
                    {
                        var instance = body.CreateVariable(to);
                        var array    = body.CreateArray(typeof(object));
                        array.AssignFromParameter(new MethodParameter(0));
                        var items = new List <ILocalIndexer>();

                        var parameters     = candidate.Parameters;
                        var parameterCount = parameters.Count;
                        for (int i = 0; i < parameterCount; i++)
                        {
                            var info = parameters[i];
                            var arg1 = array.LoadValueAtIndex(info.ParameterType, body, info.Position);
                            items.Add(arg1);
                        }

                        var constructorArgs         = new Type[candidate.Parameters.Count];
                        var candidateParameters     = candidate.Parameters;
                        var candidateParameterCount = candidateParameters.Count;
                        for (int i = 0; i < candidateParameterCount; i++)
                        {
                            var arg = candidateParameters[i];

                            constructorArgs[arg.Position] = arg.ParameterType;
                        }

                        instance.AssignFrom(body.Instantiate(to, constructorArgs, items.OfType <ILocalIndexer, ILocalIndexer>()));
                        body.Return(instance);
                    }));
                });

                var constructor = activatorType.GetConstructor(new Type[] { });

                activators.Add(candidate.Type, (SiegeActivator)constructor.Invoke(new object[] { }));
            }
        }