/// <inheritdoc /> public bool TryBuildExpression(IBuildContext buildContext, ILifetime lifetime, out Expression expression, out Exception error) { if (buildContext == null) { throw new ArgumentNullException(nameof(buildContext)); } try { var autoWiringStrategy = _autowiringStrategy ?? buildContext.AutowiringStrategy; var typeDescriptor = _createInstanceExpression.Type.Descriptor(); expression = ReplaceTypes(buildContext, _createInstanceExpression, _typesMap); var thisVar = Expression.Variable(expression.Type); var initializeExpressions = GetInitializers(buildContext.Container, autoWiringStrategy, typeDescriptor) .Select(initializer => (Expression)Expression.Call(thisVar, initializer.Info, initializer.GetParametersExpressions(buildContext))) .Concat(_initializeInstanceExpressions.Select(statementExpression => ReplaceTypes(buildContext, statementExpression, _typesMap))) .ToArray(); if (initializeExpressions.Length > 0) { expression = Expression.Block( new[] { thisVar }, Expression.Assign(thisVar, expression), Expression.Block(initializeExpressions), thisVar ); } var visitor = new DependencyInjectionExpressionVisitor(buildContext, thisVar); expression = visitor.Visit(expression) ?? expression; expression = buildContext.FinalizeExpression(expression, lifetime); error = default(Exception); return(true); } catch (BuildExpressionException ex) { error = ex; expression = default(Expression); return(false); } }