예제 #1
0
        public Func <object> BuildFactory(Type requested, IDependencyDefinition definition, IDependencyAdapter container)
        {
            if (definition.HasDelegate)
            {
                return(BuildDelegateCall(requested, definition));
            }

            ContainerReference = ContainerReference ?? Expression.Constant(container);
            ResolveMethod      = ResolveMethod ?? container.GetType().GetMethod("GetInstance", new Type[] { typeof(Type) });

            var genericTypeArgs = requested.IsGenericType
                                      ? requested.GetGenericArguments()
                                      : new Type[] {};

            var type = genericTypeArgs.Length > 0 && definition.ConcreteType.IsGenericTypeDefinition
                           ? definition.ConcreteType.MakeGenericType(genericTypeArgs)
                           : definition.ConcreteType;

            var constructors = Reflector.GetConstructorInfo(type).OrderBy(x => x.Item2.Length).Reverse();
            var constructor  = constructors
                               .FirstOrDefault(x => x.Item2.All(p => container.HasPluginFor(p.ParameterType)));

            var parameters = constructor
                             .Item2
                             .Select(x =>
            {
                var argExpr  = Expression.Constant(x.ParameterType);
                var callExpr = Expression.Call(ContainerReference, ResolveMethod, argExpr);
                return(Expression.Convert(callExpr, x.ParameterType));
            });

            var newExpr  = Expression.New(constructor.Item1, parameters);
            var castExpr = Expression.Convert(newExpr, typeof(object));

            return(Expression.Lambda <Func <object> >(castExpr).Compile());
        }