我最近遇到的有趣问题:
我实现了一个Stream类(一个自定义流管道组件的包装流),一些后来的测试让我的管道抛出异常.由于我的流是一个仅向前的,不可写的流实现(CanSeek和CanWrite返回false,位置:设置抛出异常,没什么异常),因此我调用Seek时抛出了异常,因为我已经硬编码抛出NotImplementedException.对Seek的调用来自非托管代码,因此我无法真正调试它.我真正可以告诉的是,即使我让CanSeek返回false并且用户甚至没有检查CanSeek ,我的Stream实现也会调用Seek .
那是怎么回事?
所有答案都在这里找到:在托管流式传输管道组件中实现Seek方法
事实证明,当时没有位置属性.因此,获取流指针的当前位置的方法是调用Seek( 0, SeekOrigin.Current );
迷人.旧的新事物了.
该页面要求实施Seek:
override public long Seek(long offset, SeekOrigin origin)
{
long pos = -1;
switch(origin)
{
case SeekOrigin.Begin :
pos = offset;
break;
case SeekOrigin.Current :
pos = Position + offset;
break;
case SeekOrigin.End :
break;
}
// We generally disallow seeking of the stream
// However, in unmanaged code, many people use Seek(0,CURR) to retrieve // the current position
// Special case (that is, if Seek does not change position, do not
// throw an exception)
if (pos==Position)
{
return pos;
}
else
{
throw new NotSupportedException("ForwardOnlyEventingReadStream does not support Seek()");
}
}
Run Code Online (Sandbox Code Playgroud)
这就是整个解决方案.好极了!
| 归档时间: |
|
| 查看次数: |
1288 次 |
| 最近记录: |