2009-05-05 2 views
0

기본적으로 특정 네임 스페이스의 모든 유형이 IEnumerable과 같은 특정 인터페이스를 구현하는지 알고 싶습니다.캐스팅하지 않고 특정 인터페이스를 구현하는 유형 수집?

나는 내가 할 수있는 알고

foreach type ... 
    if type is IEnumerable 
     ... 

그러나 캐스트가 떨어져 어느 쪽이든 발생합니다 때문에 싶어,이 인터페이스를 구현하는 경우 단지 쿼리 유형을 캐스팅하지 않습니다.

답변

6

입니다. 연산자는 캐스트가 아니므로 원하는 것처럼 들리는 테스트입니다. C#에서 타입 캐스팅 중 하나를 강제 캐스팅 연산자를 사용하여 (이름?) 수행과 같이 :

((IEnumerable)someCollection) 

또는 안전 캐스팅 연산자 :

someCollection as IEnumerable 
+0

감사합니다. 캐스팅하지 않았습니까? 나는 그것이 캐스팅을 사용하기를 원한다면 권장하지 않기 때문에, AFAIK를 두 번 캐스팅했기 때문에 AS 대신에 AS가 더 좋습니다. –

+0

사실 "as"가 먼저 "is"체크를 한 다음 캐스트를 수행하기 때문에 권장하지 않습니다. 따라서 "is"를 "as"로 사용하면 유형을 두 번 확인합니다 (효과적으로 "is", "is"가 다시 캐스팅됩니다). –

+0

감사합니다. 나는 그것을 몰랐습니다. –

3

내가 제대로 읽었 가정하면, 원하는 특정 인터페이스 또는 상위 유형을 구현하는 열거 형의 유형 목록. 아마도 Enumerable.OfType(this IEnumerable source)이 유용할까요?

var enumerables = myListOfThingsToCheck.OfType<IEnumerable>(); 
+0

감사합니다. 흥미 롭습니다. OfType은 목록이 안전하지 않은지 여부에 대해 신경 쓰지 않습니까? 또한이 버전을 컬렉션 외부의 단일 유형에 사용할 수 있습니까? –

+0

안전하지 않은 코드 블록에 있지 않는 한 어떤 목록도 반드시 "안전하지 않은 형식"이어야합니다. 그러나 "System.Object"목록 일 수는 있지만이 메서드는이 메서드가 설계된 것입니다. 단일 객체에서이 작업을 수행하려는 경우 "is"를 사용하십시오. –

+0

감사합니다. lc. 유형 안전에 의한 Btw는 다른 것으로 보일 경우 동일한 유형과 다른 유형을 목록에 저장하는 것을 의미합니다. –

1

람다 구문을 사용하려는 경우에도이 방법이 효과적이라고 생각합니다.

var enumerables=Assembly.GetExecutingAssembly().GetTypes().Where(t => t.Namespace == "YOUR NAMESPACE HERE").OfType<IEnumerable>(); 
관련 문제