Ejemplo n.º 1
0
        /// <summary>
        /// Return a <see cref="IResolverPolicy"/> instance that will
        /// return this types value for the parameter.
        /// </summary>
        /// <param name="type">Type that contains the member that needs this parameter. Used
        /// to resolve open generic parameters.</param>
        /// <returns>The <see cref="IResolverPolicy"/>.</returns>
        public override IResolverPolicy GetResolverPolicy(Type type)
        {
            var typeToBuild = type ?? throw new ArgumentNullException(nameof(type));

            if (ParameterType.IsArray && ParameterType.GetElementType().GetTypeInfo().IsGenericParameter)
            {
                Type arrayType = ParameterType.GetClosedParameterType(typeToBuild.GetTypeInfo().GenericTypeArguments);
                return(new NamedTypeDependencyResolverPolicy(arrayType, _name));
            }

            var info = ParameterType.GetTypeInfo();

            if (info.IsGenericType && info.ContainsGenericParameters || ParameterType.IsGenericParameter)
            {
                return(new NamedTypeDependencyResolverPolicy(
                           ParameterType.GetClosedParameterType(typeToBuild.GetTypeInfo().GenericTypeArguments), _name));
            }

            return(new NamedTypeDependencyResolverPolicy(ParameterType, _name));
        }