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()); }