C# 我应该如何包装MemoryStream以访问写入它的数据(即使在它关闭之后)

C# 我应该如何包装MemoryStream以访问写入它的数据(即使在它关闭之后),c#,stream,C#,Stream,我正在尝试使用第三方库将一些数据写入MemoryStream,以便在一些单元测试中比较输出。不幸的是,第三方库在执行MemoryStreamSave()方法时关闭了它 因此,我有以下代码: byte[] expected = LoadExpectedResult("Test1"); using (var memoryStream = new MemoryStream()) { ThirdPartyLibrary.Save(memoryStream); var result = m

我正在尝试使用第三方库将一些数据写入MemoryStream,以便在一些单元测试中比较输出。不幸的是,第三方库在执行MemoryStream
Save()
方法时关闭了它

因此,我有以下代码:

byte[] expected = LoadExpectedResult("Test1");
using (var memoryStream = new MemoryStream()) {
    ThirdPartyLibrary.Save(memoryStream);
    var result = memoryStream.ToArray();
    ConfirmBinaryBlobsAreSufficentlyEqual(expected, result);
}
不幸的是,
memoryStream.ToArray()
函数似乎只返回最后加载到缓冲区的3398字节,因为它已作为保存过程的一部分进行了处理

是否有任何东西可以将MemoryStream封装在其中,以便在向其中写入数据时,将其读取或写入另一个内存流,以便在处理它时,我仍然可以访问数据

更新


为清楚起见,
Save()
方法也会进行写操作,因此在调用之前,MemoryStream是空的。我认为库的编写者希望您只传入文件流。

为了避免错误/行为:您可以将memorystream复制到第二个实例,或者在调用ThirdPartyLibrary.Save之前将其写入某个临时文件。

您可以尝试:

public class MyMemoryStream : MemoryStream
{
    public bool CanDispose { get; set; }

    public override void Close()
    {
        if (!CanDispose)
        {
            return;
        }

        base.Close();
    }
}
在Stream类中,
Dispose()
调用
Close()
,然后调用
Dispose(bool disposing)
Close()
是虚拟的,所以我重写了它

使用流后,设置
CanDispose=true
,然后让它正常处理

byte[] expected = LoadExpectedResult("Test1");
using (var memoryStream = new MyMemoryStream()) {
    // implicitly memoryStream.CanDispose == false;
    ThirdPartyLibrary.Save(memoryStream);
    var result = memoryStream.ToArray();
    ConfirmBinaryBlobsAreSufficentlyEqual(expected, result);
    memoryStream.CanDispose = true;
}

在调用第三方库之前,您不能执行ToArray()吗?这似乎是第三方库中的一个错误。您可以将某些内容保存到流中,但关闭或处理它实际上不应该是“保存函数”业务。不幸的是,在使用
.save()
方法之前,内存流中没有要写入的数据。在
.Save()
方法中,它同时执行写入和数据调用。@JamesRobinson该方法是否接受MemoryStream或任何流类型?它将接受任何流Hi Josef我不知道这会起作用,因为在执行Save方法之前MemoryStream是空的。我明白了。因此,也许您可以测试/断言结果,第三方Library.Save将内存流保存到哪里?