public IEnumerable <Expression> GetParametersExpressions(IBuildContext buildContext) { for (var parameterPosition = 0; parameterPosition < _parametersExpressions.Length; parameterPosition++) { var param = _parameters[parameterPosition]; if (param.IsOut) { if (param.ParameterType.HasElementType) { var type = param.ParameterType.GetElementType(); if (type != null) { var outParam = Expression.Parameter(type); buildContext.AddParameter(outParam); yield return(outParam); continue; } } } var expression = _parametersExpressions[parameterPosition]; if (expression != null) { yield return(expression); } else { var key = new Key(param.ParameterType); Expression defaultExpression; if (param.IsOptional) { if (param.DefaultValue == null) { defaultExpression = Expression.Default(param.ParameterType); } else { defaultExpression = Expression.Constant(param.DefaultValue); } } else { defaultExpression = null; } yield return(buildContext.CreateChild(key, buildContext.Container).CreateExpression(defaultExpression)); } } }