public Stream GetStream(StreamType streamType, StreamParameters streamParameters)
        {
            LoadStreamFactories();

            if (_streamFactoriesHash.ContainsKey(streamType))
            {
                return _streamFactoriesHash[streamType].Create(streamParameters);
            }

            throw new ArgumentException(string.Format("No Factory defined for type {0}", streamType));
        }
        public Stream Create(StreamParameters streamParameters)
        {
            if(streamParameters != null)
            {
                var cryptoStreamParameters = streamParameters as CryptoStreamParameters;
                
                if(cryptoStreamParameters != null && cryptoStreamParameters.Stream != null && cryptoStreamParameters.CryptoTransform != null)
                {
                    return _cryptoStreamFactory.Create(cryptoStreamParameters.Stream, cryptoStreamParameters.CryptoTransform, cryptoStreamParameters.CryptoStreamMode);
                }

                throw new ArgumentException("StreamParameters must be of type CryptoStreamParameters with Stream and CryptoTransform, no default constructor exists!");
            }

            throw new ArgumentNullException("streamParameters");
        }
        public Stream Create(StreamParameters streamParameters)
        {
            if (streamParameters != null)
            {
                var memoryStreamParameters = streamParameters as MemoryStreamParameters;

                if (memoryStreamParameters != null)
                {
                    if (memoryStreamParameters.Buffer != null)
                    {
                        if (memoryStreamParameters.Writable.HasValue)
                        {
                            if (memoryStreamParameters.Index.HasValue && memoryStreamParameters.Count.HasValue)
                            {
                                if (memoryStreamParameters.PubliclyVisible.HasValue)
                                {
                                    return _memoryStreamFactory.Create(memoryStreamParameters.Buffer, memoryStreamParameters.Index.Value, memoryStreamParameters.Count.Value, memoryStreamParameters.Writable.Value, memoryStreamParameters.PubliclyVisible.Value);
                                }

                                return _memoryStreamFactory.Create(memoryStreamParameters.Buffer, memoryStreamParameters.Index.Value, memoryStreamParameters.Count.Value, memoryStreamParameters.Writable.Value);
                            }

                            return _memoryStreamFactory.Create(memoryStreamParameters.Buffer, memoryStreamParameters.Writable.Value);
                        }

                        if (memoryStreamParameters.Index.HasValue && memoryStreamParameters.Count.HasValue)
                        {
                            return _memoryStreamFactory.Create(memoryStreamParameters.Buffer, memoryStreamParameters.Index.Value, memoryStreamParameters.Count.Value);
                        }

                        return _memoryStreamFactory.Create(memoryStreamParameters.Buffer);
                    }

                    if (memoryStreamParameters.Capacity.HasValue)
                    {
                        return _memoryStreamFactory.Create(memoryStreamParameters.Capacity.Value);
                    }
                }
            }

            return _memoryStreamFactory.Create();
        }