private Expression ReplacePlaceHoldersWithOverriddenParameters(Expression expression)
        {
            if (this.overriddenParameters != null)
            {
                foreach (var overriddenParameter in this.overriddenParameters.Values)
                {
                    expression = SubExpressionReplacer.Replace(
                        expressionToAlter: expression,
                        nodeToFind: overriddenParameter.PlaceHolder,
                        replacementNode: overriddenParameter.Expression);
                }
            }

            return(expression);
        }
        private Func <object, object> BuildDelegate()
        {
            PropertyInfo[] propertiesToInject = this.GetInjectableProperties();

            var dummyExpression = Expression.Constant(null, this.Type);

            var propertyInjectionExpression = PropertyInjectionHelper.BuildPropertyInjectionExpression(
                this.container, this.Type, propertiesToInject, dummyExpression);

            var parameter = Expression.Parameter(typeof(object));

            propertyInjectionExpression = SubExpressionReplacer.Replace(
                expressionToAlter: propertyInjectionExpression,
                subExpressionToFind: dummyExpression,
                replacementExpression: Expression.Convert(parameter, this.Type));

            return(Expression.Lambda <Func <object, object> >(propertyInjectionExpression, parameter).Compile());
        }