2011-07-06 2 views
2

형식 비교와 관련하여 흥미로운 문제가 있습니다. 뭔가 내 테스트 동안 수집명시 적 형식과의 암시 적 형식 비교 - C#

var obField = value.GetType().InvokeMember(_stCollectionField, 
           System.Reflection.BindingFlags.GetProperty, 
           null, value, null); 

if (obField.GetType() != typeof(IEnumerable<object>)) 
{ 
    return true; 
} 

어떤 종류의 경우 I 테스트, 명시 적 유형으로 묵시적 타입을 비교하려고 해요, 나는 obField이 개체의 컬렉션으로 판명 것이라는 점을 보장 할 수 있습니다. 그러나, 나는 항상 내가 그 건너 뛸하고자하는 대신 확인 및 return true, 내부에서 실행됩니다 찾는하고있어 (두 가지 유형이 동일 변경할 수 없기.)

약간의 디버깅은 나에게 obFieldobject {System.Collections.Generic.List<System.DateTime>} 등의 유형을 제공합니다 .

어떻게하면 해당 유형과 일치시킬 수 있습니까?

감사

+1

'목록 '명확 타입의'IEnumerable을하지 않습니다 '... 다시 당신의 질문은 무엇입니까? –

+0

목록 는 IEnumerable 을 확장합니까? – AndyBursh

+1

@Andy : 사실이지만 "=="은 "확장 가능"이 아니라 "is * equal to to"를 의미합니다 ("! ="에도 동일하게 적용됩니다). 'List '와'IEnumerable '는 * equal *이 아니기 때문에 "! ="는 true로 평가됩니다. – Heinzi

답변

3

사용 Type.IsAssignableFrom을, 여기에 사용 된 예를 들면 다음과 같습니다 Getting all types that implement an interface

:

obField`이 유형 인`경우
if (typeof(IEnumerable<object>).IsAssignableFrom(obField.GetType())) { ... } 
+1

추가 : 인터페이스에 대한 공분산을 이전에 사용할 수 없었기 때문에이 기능은 .NET 4에서만 작동합니다. –

+0

매력처럼 작동합니다, 감사합니다! – AndyBursh

+0

@Andy : 어떤 종류의 콜렉션을 테스트하고 싶다면 아마 제네릭이 아닌'IEnumerable' 인터페이스와 비교하는 것이 더 나을 것입니다. – LukeH