2012-02-07 4 views
3

가 발생합니다. m_entityComponents = 모든 엔티티 및 키 : 엔티티 개체 및 값을 가진 해당 구성 요소 목록의 사전 : 구성 요소 목록입니다.순회 내가 다음 코드가 예외

IComponents 인터페이스를 구현하는 여러 클래스가 있습니다. GetComponentType() 함수는 모든 엔티티를 반복하고 특정 유형의 엔티티 ID와 구성 요소에 대한 사전을 만듭니다.

예를 들어

: 나는 위치 구성 요소가있는 모든 엔티티의 목록을 얻으려면 다음 내가 사용하는 것입니다 : 그것은 '아무튼 때문에

entityManager.GetComponentType<Location>(); 

내가 실행 해요 문제는 두 번째 루프 내 사전을 통해 필터링하는 것 같습니다. 대신 사전에있는 모든 구성 요소를 위치 유형으로 캐스팅하려고 시도합니다. 위치 유형은 물론 예외를 발생시킵니다. 이 코드를 어떻게 변경하여 원하는대로 처리 할 수 ​​있습니까?

답변

2

당신은 .OfType<T> 방법을 사용할 수 있습니다.

+0

방금 ​​시도해 본 .OfType ()은 나를위한 방법 옵션이 아닙니다. 해당 기능 또는 다른 용도로 사용 설명서를 추가해야합니까? – Kittoes0124

+0

@Kittoes : 예, LINQ 네임 스페이스가 필요합니다. 간단히'using System.Linq; '을 추가하십시오. –

+0

질문하기 전에 LINQ를 먼저 추가해야한다고 생각했습니다. 나는이 솔루션을 정말로 좋아합니다. 왜냐하면 저는 무엇인가를 캐스팅 할 필요가 없기 때문입니다. 위의 ChaosPandion의 해결책도 꽤 잘 해결되었습니다. 두 가지 옵션 중 어느 것이 더 안전하며이 둘 사이에 성능 차이가 있습니까? – Kittoes0124

4

컬렉션에 다른 유형이있는 경우 적절한 유형을 테스트해야합니다.

foreach (T t in m_entityComponents[m_allEntities[pair.Key]].OfType<T>()) 

이 제네릭 형식을 일치하는 요소를 필터링 :

public Dictionary<int, T> GetComponentType<T>() where T: IComponent 
{ 
    Dictionary<int, T> components = new Dictionary<int, T>(); 

    foreach (KeyValuePair<int, Entity> pair in m_allEntities) 
    { 
     foreach (IComponent c in m_entityComponents[m_allEntities[pair.Key]]) 
     { 
      if (c is T) 
       components.Add(pair.Key, (T)c); 
     } 
    } 

    return components; 
} 
+0

감사합니다. 방금이 변경 사항을 테스트했지만 컴파일되지 않습니다. 실패한 행은 다음과 같습니다. var t = c as T;. 오류 : "형식 매개 변수 'T'는 (는) 클래스 형식 제약 조건이나 '클래스'제약 조건이 없기 때문에 'as'연산자와 함께 사용할 수 없습니다." – Kittoes0124

+0

@Kittoes - 오류가 매우 구체적이라는 사실을 무시합니다. 그러나 내 변경 사항을 살펴보면 클래스 제약 조건의 필요성이 제거됩니다. – ChaosPandion

+0

다시 한 번 감사드립니다. 결국 꽤 잘되었습니다. jimmy_keen도 내가 선호하는 솔루션을 게시했습니다. 어느 것이 좋습니다 (둘 다 내가 필요한 것을 정확하게 수행했기 때문에). – Kittoes0124

관련 문제