我正在调用一个写入流的DLL.dll中方法的签名如下:
public bool SomeMethod(Stream stream);
Run Code Online (Sandbox Code Playgroud)
并且该方法基本上将二进制数据写入该流.所以,如果我将该方法称为:
var file = System.IO.File.Create("SomeFile.txt");
/* call dll method */ SomeMethod(file);
Run Code Online (Sandbox Code Playgroud)
然后我基本上将输出写入该文件.在这个问题中,我将输出写入networkStream.
无论如何回到这个问题.我想创建自己的流的原因是因为我想知道什么时候发生一些事件.例如,如果我在哪里创建自己的流类:
class MyStream : Stream
{
private long Position;
public override int Read(byte[] buffer, int offset, int count)
{
// implementation goes here
/* HERE I COULD CALL A CUSTOM EVENT */
}
public override long Seek(long offset, SeekOrigin origin)
{
// SAME THING I WILL LIKE TO PERFORM AN ACTION IF THIS METHOD IS CALLED!
}
// etc implement rest of abstract methods....
Run Code Online (Sandbox Code Playgroud)
我正在将该流的输出写入网络,因此如果发生某些事件,我可能希望减速.如果我在哪里控制dll,那么我就不会尝试实现它.
如果有人能向我展示如何实现抽象Stream类的抽象方法的一个非常基本的例子,我将不胜感激.
Ale*_*kov 16
最简单的自定义流是"包装"其他流(类似于压缩流)的流.每种方法都只是将其实现重定向到内部流.
class MyStream : Stream
{
Stream inner;
public MyStream(Stream inner)
{
this.inner = inner;
}
public override int Read(byte[] buffer, int offset, int count)
{
var result = inner.Read(buffer, offset, count);
/* HERE I COULD CALL A CUSTOM EVENT */
return result;
}
///
}
Run Code Online (Sandbox Code Playgroud)
用法样本:functionThatTakesStream(new MyStream(new MemoryStream());.
真实代码需要在触发事件之前/之后处理内部流的操作中的异常并正确处理IDisposable.