避免处理底层流

Dan*_*röm 4 .net file mocking

我正在尝试模拟一些文件操作.在我的"真实"对象中:

StreamWriter createFile( string name )
{
  return new StreamWriter( Path.Combine( _outFolder, name ), false, Encoding.UTF8 ) );
}
Run Code Online (Sandbox Code Playgroud)

在模拟对象我有:

StreamWriter createFile( string name )
{
  var ms = new MemoryStream();
  _files.Add( Path.Combine( _outFolder, name ), ms );
  return new StreamWriter( ms, Encoding.UTF8 ) );
}
Run Code Online (Sandbox Code Playgroud)

其中_files是一个字典,用于存储创建的文件以供以后检查.

但是,当消费者关闭StreamWriter时,它还会处理MeamoryStream ...... :-(

有关如何追求这个的任何想法?

Jen*_*und 6

如果你继承MemoryStream,这将有效但你必须调用ManualDispose方法来关闭底层流.
我不确定,但我认为这个对象在超出范围时会被垃圾收集.

public sealed class ManualMemoryStream : MemoryStream
{
    protected override void Dispose(bool disposing)
    {
    }
    public void ManualDispose()
    {
        base.Dispose(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:
如果您希望刷新MemoryStream并准备从顶部读取,则可以选择此选项.

public sealed class ManualMemoryStream : MemoryStream
{
    protected override void Dispose(bool disposing)
    {
        Flush();
        Seek(0, SeekOrigin.Begin);
    }
    public void ManualDispose()
    {
        base.Dispose(true);
    }
}
Run Code Online (Sandbox Code Playgroud)