2010-12-23 3 views
0

<T> 형식을 묻는 메서드가 있습니다. 이 유형에는 Count 속성이 정의되어 있어야합니다. Count이 정의 된 모든 객체를 허용하는 유형 제약 조건으로 어떻게 지정할 수 있습니까? 내가 IDictionary 함께 사용하면C에서 메서드의 일반 형식에 대한 제약 #

private static void writeData<T>(String fileName, T rawData) where T : ICollection 

그러나,이 작동하지 않습니다

이 내가 현재 가지고있는 것입니다. 그 밖의 무엇을 시도 할 수 있습니까?

업데이트 : 나는 문제가 내가 대신 일반 ICollection<E>의 비 일반 ICollection에 제약 해요 것으로 생각합니다.

+0

'이 작동하지 않습니다'를 정의하십시오. 이것은 그대로 작동해야합니다. –

+0

IDictionary 를 원하십니까? IDictionary impelements ICollection 이후 – Vadim

+0

당신은 "구조적 타이핑"이라고하는 것을 찾고 있습니다. 스칼라 구문과 동일한 C#을 묻는 http://stackoverflow.com/questions/2831175/does-c-have-an-equivalent-to-scalas-structural-typing을 참조하십시오. 웹에서 찾은 대답은 (간단히 말해서) "아니오"입니다. ( –

답변

2

ICollection을 구현하므로 코드가 IDictionary과 함께 작동해야합니다.
(일반이 아닌) ICollection을 구현하지 않으므로 IDictionary<TKey, TValue>과 작동하지 않습니다. 당신이 일반적인 컬렉션을 수락 할 경우
, 당신은 당신이 실제로 여기에 제네릭을 사용할 필요가 없습니다, 그런데

static void WriteData<TElement>(String fileName, ICollection<TElement> rawData) 

으로 변경할 수 있습니다; 당신은 단지 타입 ICollection의 매개 변수를 취할 수 있으며 호출자는 파생 된 유형을 전달할 수 있습니다.
일반 콜렉션을 사용하려면 요소에 대한 유형 매개 변수가 필요하지만 콜렉션 유형에는 필요하지 않습니다.

다른 질문에 답하려면 인터페이스를 만드는 것 외에는 속성의 존재로 매개 변수를 제한 할 수 없습니다.
프레임 워크에 ICountedEnumerable 인터페이스가 없으므로 운이 좋지 않습니다. (자신 만의 인터페이스를 만들고 그것을 구현하는 커스텀 콜렉션 만 허용하지 않는다면)

+0

@ 일반 : 그는 제네릭을 사용하지 않고 있습니다. 그렇지 않으면 두 가지 매개 변수가 필요합니다. – SLaks

0

나는 이것을 컴파일 타임에 할 수 있다고 생각하지 않는다.

리플렉션을 사용하여 T에 Count 메소드가 있는지 확인한 다음 호출 할 수 있습니다.

0

업데이트에 대한 응답으로 : 그런 다음 사전을 전달하지 마십시오. 대신 dictionaryVariable.Values을 전달하십시오.

관련 문제