2017-11-06 5 views
0

클래스가 있는데 직렬 포트 통신을하고 있습니다. 클래스는 byte[], char[], string 유형으로 초기화해야합니다.반 제네릭 클래스 - "T"에 "Length"에 대한 정의가 없습니다.

클래스는 또한 발신 데이터 및하여 SerialPort에 데이터를 기록 할 때

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

문제점 occures 들어오는 데이터

를 저장하는 큐를 제공
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

컴파일되지 않는다.

오류 :

"T" does not contain a definition for "Length".

I 해달라고도, 여기에 올바른 방법이 클래스는 일반적인 만드는 알고 ... 정말 일반적인 밤은 때문에

그러나 필자는 세 가지 "오버로드"를 만들기 피하려고 string, byte[], char[]에 대한 클래스입니다.

여기로가는 길은 무엇입니까?

+9

제네릭의 남용과 같으며 실제로 수행해야 할 작업은'byte [] '를 사용하고 다른 데이터 유형에 어댑터/매퍼를 작성하는 것입니다. –

+1

'문자열'이 아니라면 무엇입니까? – SeM

+0

다음은'byte []'또는'char []'중 하나입니다 –

답변

1

으로 한스 옆모습는 말했다 :

It is not generic when it can handle only 3 types. Use method overloads instead.

하나의 옵션은 (가능하다면) 한스는 제안 방법의 오버로드를 사용하는 것입니다. 들어오는 매개 변수를 캐싱하고 나중에 처리해야하는 필요성보다는 직접 들어오는 매개 변수를 직접 사용할 수 있다면 실제로 가능합니다.

또한 일반 기본 클래스를 만들 수 있으며 지원해야하는 특정 유형의 오버로드를 제공 할 수 있습니다. byte[] (ByteSerialServices : SerialServices<byte[]>)와 string (StringSerialServices : SerialServices<string>)에 대한

귀하의 SendData 예를 들어,있을 수 다른 구현.

관련 문제