2010-08-21 2 views
2

C#에서 Reflection을 사용하여 런타임에 컬렉션 속성의 개체 유형을 확인하려고합니다. 이러한 개체는 Entity Framework에서 생성되는 엔터티입니다.C#의 컬렉션에있는 개체 유형을 확인하는 방법

Type t = entity.GetType(); 
PropertyInfo [] propInfo = t.GetProperties(); 
foreach(PropertyInfo pi in propInfo) 
{ 
    if (pi.PropertyType.IsGenericType) 
    { 
     if (pi.PropertyType.GetGenericTypeDefinition() 
      == typeof(EntityCollection<>)) 
     // 'ToString().Contains("EntityCollection"))' removed d2 TimWi's advice 
     // 
     // ---> this is where I need to get the underlying type 
     // ---> of the objects in the collection :-) 
     // etc. 
    } 
} 

컬렉션에 포함 된 개체 유형을 어떻게 식별합니까?

편집 : 위의 업데이트 된 코드, 그것은 당신이 컬렉션 형식의 제네릭 인수를 검색 할 수 GetGenericArguments()을 사용할 수 있습니다

+0

를 뭐죠 당신이 해결하려는 문제? 왜 컬렉션의 유형을 알아야합니까? 나는 그들이 모두 같은 타입이 아닌 것으로 생각한다? – PatrickSteele

+0

사실 그들은 같은 유형입니다. 새 개체를 만들어 사용자가 값을 설정하도록해야하지만 디자인 타임에 형식을 알지 못합니다. 따라서 리플렉션을 사용하여 생성자를 가져오고 궁극적으로 적절한 컬렉션에 새 객체를 추가합니다. – Jay

답변

3

작동하도록 첫째 .IsGenericType 쿼리 추가 (EntityCollection<string>, 예를 들어, 일반적인 인수는 string입니다). EntityCollection<> 항상 하나 개의 일반적인 인자를 가지고 있기 때문에, GetGenericArguments()는 항상 단일 요소 배열을 반환합니다, 그래서 당신은 안전하게 그 배열의 첫 번째 요소를 검색 할 수 있습니다

if (pi.PropertyType.IsGeneric && 
    pi.PropertyType.GetGenericTypeDefinition() == typeof(EntityCollection<>)) 
{ 
    // This is now safe 
    var elementType = pi.PropertyType.GetGenericArguments()[0]; 

    // ... 
} 
+0

상품 [0]? "GetGenericArguments()"를 의미합니까? 그것은 비어 있지 않습니다. –

+0

좋은 지적 커크. GenericArguments의 [0] 요소를 쿼리하는 대신 엔티티 개체 컬렉션의 [0] 요소 (비어있을 수 있음)를 쿼리하는 코드를 오해했습니다. – Jay

+0

감사합니다. Timwi. 유일한 문제는 속성이 제네릭 형식이 아닌 경우 예외가 throw된다는 것입니다. 귀하의 제안과 추가 "if (pi.PropertyType.IsGenericType)"라인으로 내 질문을 업데이트했습니다. – Jay

관련 문제