기본적으로 특정 네임 스페이스의 모든 유형이 IEnumerable
과 같은 특정 인터페이스를 구현하는지 알고 싶습니다.캐스팅하지 않고 특정 인터페이스를 구현하는 유형 수집?
나는 내가 할 수있는 알고
foreach type ...
if type is IEnumerable
...
그러나 캐스트가 떨어져 어느 쪽이든 발생합니다 때문에 싶어,이 인터페이스를 구현하는 경우 단지 쿼리 유형을 캐스팅하지 않습니다.
기본적으로 특정 네임 스페이스의 모든 유형이 IEnumerable
과 같은 특정 인터페이스를 구현하는지 알고 싶습니다.캐스팅하지 않고 특정 인터페이스를 구현하는 유형 수집?
나는 내가 할 수있는 알고
foreach type ...
if type is IEnumerable
...
그러나 캐스트가 떨어져 어느 쪽이든 발생합니다 때문에 싶어,이 인터페이스를 구현하는 경우 단지 쿼리 유형을 캐스팅하지 않습니다.
은입니다. 연산자는 캐스트가 아니므로 원하는 것처럼 들리는 테스트입니다. C#에서 타입 캐스팅 중 하나를 강제 캐스팅 연산자를 사용하여 (이름?) 수행과 같이 :
이((IEnumerable)someCollection)
또는 안전 캐스팅 연산자 :
someCollection as IEnumerable
내가 제대로 읽었 가정하면, 원하는 특정 인터페이스 또는 상위 유형을 구현하는 열거 형의 유형 목록. 아마도 Enumerable.OfType(this IEnumerable source)이 유용할까요?
var enumerables = myListOfThingsToCheck.OfType<IEnumerable>();
감사합니다. 흥미 롭습니다. OfType은 목록이 안전하지 않은지 여부에 대해 신경 쓰지 않습니까? 또한이 버전을 컬렉션 외부의 단일 유형에 사용할 수 있습니까? –
안전하지 않은 코드 블록에 있지 않는 한 어떤 목록도 반드시 "안전하지 않은 형식"이어야합니다. 그러나 "System.Object"목록 일 수는 있지만이 메서드는이 메서드가 설계된 것입니다. 단일 객체에서이 작업을 수행하려는 경우 "is"를 사용하십시오. –
감사합니다. lc. 유형 안전에 의한 Btw는 다른 것으로 보일 경우 동일한 유형과 다른 유형을 목록에 저장하는 것을 의미합니다. –
람다 구문을 사용하려는 경우에도이 방법이 효과적이라고 생각합니다.
var enumerables=Assembly.GetExecutingAssembly().GetTypes().Where(t => t.Namespace == "YOUR NAMESPACE HERE").OfType<IEnumerable>();
감사합니다. 캐스팅하지 않았습니까? 나는 그것이 캐스팅을 사용하기를 원한다면 권장하지 않기 때문에, AFAIK를 두 번 캐스팅했기 때문에 AS 대신에 AS가 더 좋습니다. –
사실 "as"가 먼저 "is"체크를 한 다음 캐스트를 수행하기 때문에 권장하지 않습니다. 따라서 "is"를 "as"로 사용하면 유형을 두 번 확인합니다 (효과적으로 "is", "is"가 다시 캐스팅됩니다). –
감사합니다. 나는 그것을 몰랐습니다. –