如何在 C# 中使用 SerialPort 和 NetworkStream 之间的公共接口?
How to use a common interface between SerialPort and NetworkStream in C#?
我有一个从 SerialPort 连接读取字节的 C# 方法 _TryReadChunk:
private bool _TryReadChunk(SerialPort connection, int n_exp, out byte[] received)
{
...
received = new byte[n_exp];
int bytes_read = connection.Read(received, length, n_exp);
...
}
我再次需要相同的方法,但从 NetworkStream 中读取。我认为一种优雅的方法是使用像
这样的通用方法
private bool _TryReadChunk<T> (T connection, int n_exp, out byte[] received)
{
...
}
但是,我不知何故需要向 T 必须实现 Read 方法的方法添加约束。首先我想定义一个像
这样的接口
interface _CanRead
{
int Read(byte[] buffer, int offset, int count);
}
并要求
private bool _TryReadChunk<T> (T connection, int n_exp, out byte[] received) where T : _CanRead
{
...
}
但是当阅读更多内容时,我的印象是 SerialPort 和 NetworkStream 必须显式实现该接口,当然,它们不会。
我是泛型的新手,感觉有点卡壳。有没有办法做我想做的事,还是我应该硬着头皮实施我的方法两次?
这可能不是一个很好的泛型应用程序,但它适用于使用基 类。 SerialPort有个属性叫BaseStream,就是一个Stream。 NetworkStream 也派生自流,所以你可以这样做:
private bool _TryReadChunk(Stream connection, int n_exp, out byte[] received)
{
...
}
然后传入SerialPort.BaseStream对象或者NetworkStream对象,然后就可以使用标准的Stream.Read方法将数据读出来了。
您不必重新实施已经可用的。可以用SerialPort.BaseStream
属性直接用
NetworkStream
已经是一个 Stream
而 SerialPort.BaseStream
暴露了一个 Stream
。您可以将 Stream
作为 TryReadChunk
方法的参数并直接读取流。
我有一个从 SerialPort 连接读取字节的 C# 方法 _TryReadChunk:
private bool _TryReadChunk(SerialPort connection, int n_exp, out byte[] received)
{
...
received = new byte[n_exp];
int bytes_read = connection.Read(received, length, n_exp);
...
}
我再次需要相同的方法,但从 NetworkStream 中读取。我认为一种优雅的方法是使用像
这样的通用方法private bool _TryReadChunk<T> (T connection, int n_exp, out byte[] received)
{
...
}
但是,我不知何故需要向 T 必须实现 Read 方法的方法添加约束。首先我想定义一个像
这样的接口interface _CanRead
{
int Read(byte[] buffer, int offset, int count);
}
并要求
private bool _TryReadChunk<T> (T connection, int n_exp, out byte[] received) where T : _CanRead
{
...
}
但是当阅读更多内容时,我的印象是 SerialPort 和 NetworkStream 必须显式实现该接口,当然,它们不会。
我是泛型的新手,感觉有点卡壳。有没有办法做我想做的事,还是我应该硬着头皮实施我的方法两次?
这可能不是一个很好的泛型应用程序,但它适用于使用基 类。 SerialPort有个属性叫BaseStream,就是一个Stream。 NetworkStream 也派生自流,所以你可以这样做:
private bool _TryReadChunk(Stream connection, int n_exp, out byte[] received)
{
...
}
然后传入SerialPort.BaseStream对象或者NetworkStream对象,然后就可以使用标准的Stream.Read方法将数据读出来了。
您不必重新实施已经可用的。可以用SerialPort.BaseStream
属性直接用
NetworkStream
已经是一个 Stream
而 SerialPort.BaseStream
暴露了一个 Stream
。您可以将 Stream
作为 TryReadChunk
方法的参数并直接读取流。