我正在调用一个写入流的 dll。 dll 中方法的签名如下所示:
public bool SomeMethod(Stream stream);
并且该方法基本上会将二进制数据写入该流。因此,如果我将该方法称为:
var file = System.IO.File.Create("SomeFile.txt");
/* call dll method */ SomeMethod(file);
然后我基本上会将输出写入该文件。在这个问题中,我将输出写入 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....
我正在将该流的输出写入网络,因此如果发生某些事件我可能想放慢速度。如果我在哪里可以控制 dll,那么我就不会尝试实现它。
如果有人能向我展示一个关于如何实现抽象流类的抽象方法的非常基本的示例,我将不胜感激。
最佳答案
最简单的自定义流是一种“包装”其他流的流(类似于压缩流)。每个方法都会简单地将其实现重定向到内部流。
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;
}
///
}
用法示例:functionThatTakesStream(new MyStream(new MemoryStream()));
。
真正的代码需要在触发事件之前/之后处理内部流操作中的异常,并正确处理 IDisposable。
关于c# - 实现自定义流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12328623/