半通用类 - " T"不包含"长度"

时间:2017-11-06 08:34:04

标签: c# generics

我有一个班级,正在进行一些串口通信。 该类应初始化为byte[]char[]string的类型。

该类还提供用于存储传出数据和传入数据的队列

class SerialServices<T>
{
  //...
  Queue<T> requestDataQueue;
  Queue<T> responseDataQueue;
  //...
}

将数据写入SerialPort时出现问题:

public override Task SendData()
{
  //...
  T requestData = requestDataQueue.Dequeue();

  if (typeof(T) == typeof(string))
  {
    this.sp.Write(requestData as string);
  }
  else
  {
   this.sp.Write(requestData, 0, requestData.Length);
  }
  //...
}

requestData.Length没有编译。

错误:

  

&#34; T&#34;不包含&#34;长度&#34;的定义。

我甚至不知道在这里使类通用是正确的方法,因为它不是非常通用的......

但我试图避免制造三种不同的超载&#34; stringbyte[]char[]的课程。

去这里的方法是什么?

1 个答案:

答案 0 :(得分:1)

正如Hans Passant所说:

  

它只能处理3种类型时不通用。改为使用方法重载。

一个选项(如果可能)是使用Hans建议的方法重载。只有你可以直接使用传入的参数,而不是需要缓存它们并在以后处理它们时,这才真正可行。

您还可以创建通用基类,并为需要支持的特定类型提供重载。

您的SendData可能会对byte[]ByteSerialServices : SerialServices<byte[]>)和stringStringSerialServices : SerialServices<string>)有不同的实现。