示例#1
0
        /// <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));
        }
示例#2
0
        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);
        }