static private ResolvableInjectable <IResolvable <TResolvableValue>, TInjectable, TTarget, TResolvableValue, TInjectableValue> AsResolvableInjectableBase <TInjectable, TTarget, TResolvableValue, TInjectableValue>(MemberInfo memberInfo, Type defaultType, Func <IInjectionExpression, TInjectable> injectableFactory)
            where TInjectable : IInjectable <TTarget, TInjectableValue>
            where TResolvableValue : TInjectableValue
        {
            Attribute[]             attributes          = memberInfo.Attributes();
            ResolvableAttributeBase resolvableAttribute = attributes.ResolvableAttribute();

            IResolvable <TResolvableValue> resolvable = resolvableAttribute.GetResolvable <TResolvableValue>(defaultType, attributes);
            TInjectable injectable = injectableFactory(resolvableAttribute.GetInjectionScenario(defaultType));

            return(new ResolvableInjectable <IResolvable <TResolvableValue>, TInjectable, TTarget, TResolvableValue, TInjectableValue>(resolvable, injectable));
        }
        static public ResolvableInjectable <IResolvable, InjectableParameter> AsResolvableInjectable(this ParameterInfo parameterInfo)
        {
            Attribute[]             attributes          = parameterInfo.Attributes();
            ResolvableAttributeBase resolvableAttribute = attributes.ResolvableAttribute();

            var injectable = new InjectableParameter(resolvableAttribute.GetInjectionScenario(parameterInfo.ParameterType), parameterInfo);

            IResolvable resolvable = resolvableAttribute.GetResolvable(injectable.Type, attributes);

            if (injectable.HasDefaultValue)
            {
                resolvable = new DefaultableResolvable(resolvable, injectable.DefaultValue);
            }

            return(new ResolvableInjectable <IResolvable, InjectableParameter>(resolvable, injectable));
        }