public bool TryGetWithoutType <TKey>(IReadOnlyKeyValueCollection parameters, string keyType, out TKey key)
            where TKey : IKey
        {
            Ensure.NotNull(parameters, "parameters");
            parameters = new KeyValueProviderWrapper(parameters, null, keyType);

            return(TryGet(parameters, out key));
        }
        public bool TryGet <TKey>(IReadOnlyKeyValueCollection parameters, string prefix, out TKey key)
            where TKey : IKey
        {
            Ensure.NotNull(parameters, "parameters");

            if (!string.IsNullOrEmpty(prefix))
            {
                parameters = new KeyValueProviderWrapper(parameters, prefix, null);
            }

            return(TryGet(parameters, out key));
        }
        public bool TryGetWithoutType(IReadOnlyKeyValueCollection parameters, string keyType, out IKey key)
        {
            Ensure.NotNull(parameters, "parameters");

            Type type;

            if (!Definitions.keyTypeToClass.TryGetValue(keyType, out type))
            {
                throw new MissingKeyTypeToKeyClassMappingException(keyType);
            }

            parameters = new KeyValueProviderWrapper(parameters, null, keyType);
            return(TryGet(parameters, type, out key));
        }
        public bool TryGet(IReadOnlyKeyValueCollection parameters, string prefix, out IKey key)
        {
            Ensure.NotNull(parameters, "parameters");

            if (!string.IsNullOrEmpty(prefix))
            {
                parameters = new KeyValueProviderWrapper(parameters, prefix, null);
            }

            string keyType = parameters.Get <string>("Type");
            Type   type;

            if (!Definitions.keyTypeToClass.TryGetValue(keyType, out type))
            {
                throw new MissingKeyTypeToKeyClassMappingException(keyType);
            }

            return(TryGet(parameters, type, out key));
        }