如何在 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 已经是一个 StreamSerialPort.BaseStream 暴露了一个 Stream。您可以将 Stream 作为 TryReadChunk 方法的参数并直接读取流。