/// <inheritdoc /> public bool TryBuildExpression(IBuildContext buildContext, ILifetime lifetime, out Expression expression, out Exception error) { if (buildContext == null) { throw new ArgumentNullException(nameof(buildContext)); } var typesMap = new Dictionary <Type, Type>(); try { if (_instanceExpression.Type.Descriptor().IsGenericTypeDefinition()) { TypeMapper.Shared.Map(_instanceExpression.Type, buildContext.Key.Type, typesMap); foreach (var mapping in typesMap) { buildContext.MapType(mapping.Key, mapping.Value); } } } catch (BuildExpressionException ex) { error = ex; expression = default(Expression); return(false); } return (new BaseDependency( _instanceExpression.Body, _initializeInstanceExpressions.Select(i => i.Body), typesMap, _autowiringStrategy) .TryBuildExpression(buildContext, lifetime, out expression, out error)); }
private TypeDescriptor CreateTypeDescriptor(IBuildContext buildContext, Type type, Dictionary <Type, Type> typesMap) { var typeDescriptor = type.Descriptor(); if (!typeDescriptor.IsConstructedGenericType()) { return(typeDescriptor); } TypeMapper.Shared.Map(type, buildContext.Key.Type, typesMap); foreach (var mapping in typesMap) { buildContext.MapType(mapping.Key, mapping.Value); } var genericTypeArgs = typeDescriptor.GetGenericTypeArguments(); var isReplaced = false; for (var position = 0; position < genericTypeArgs.Length; position++) { var genericTypeArg = genericTypeArgs[position]; var genericTypeArgDescriptor = genericTypeArg.Descriptor(); if (genericTypeArgDescriptor.IsGenericTypeDefinition() || genericTypeArgDescriptor.IsGenericTypeArgument()) { if (typesMap.TryGetValue(genericTypeArg, out var genericArgType)) { genericTypeArgs[position] = genericArgType; isReplaced = true; } else { genericTypeArgs[position] = buildContext.Container.Resolve <ICannotResolveGenericTypeArgument>().Resolve(buildContext, _typeDescriptor.Type, position, genericTypeArg); isReplaced = true; } } } if (isReplaced) { typeDescriptor = typeDescriptor.GetGenericTypeDefinition().MakeGenericType(genericTypeArgs).Descriptor(); } return(typeDescriptor); }