2012-12-19 4 views
2

게임용 구성 요소 엔티티 시스템을 작성 중이며 약간의 도로 블록을 쳤습니다. 엔티티의 모든 구성 요소가 포함 된 List<Component> 파생 클래스 호출 ComponentList가 있습니다. 또한 GetComponent라는 구성 요소를 반환하는 메서드가 있습니다. 문자열 이름으로이 작업을 수행합니다. 다시 밖으로 당겨 다음, ComponentList로 고집 구성 요소에서 클래스를 파생 할 때 목록에서 특정 유형을 반환하십시오.

public Component GetComponent(string name) 
    { 
     foreach (var c in this) 
     { 
      if (c.Name == name) 
       return c; 
     } 
     throw new Exception("Component " + name + " does not exist."); 
    } 

그러나, 나는 약간의 불편이 유형에 캐스팅해야합니다. 경우에도 적용이 상황에,

TestComponent t1 = (TestComponent)Entity.ComponentList.GetComponent("Test1"); 

나는 < T와 유형을 몇 가지 특별한 마술 방법이 알고>하지만 난 그것을 사용하는 방법을 잘 모르겠어요 나. 어떠한 제안?

답변

3

코드 :

public T GetComponent<T>(string name) where T : Component 
{ 
    var result = this.FirstOrDefault(c => c.Name == name); 
    if(result == null) 
     throw new Exception("Component " + name + " does not exist."); 
    return (T) result; 
} 

사용법 :

이 가능 언어 기능은 generics라고하면 MSDN에 대한 자세한 (많은, 많은 다른 장소를 읽을 수
var testComponent = componentFactory.GetComponent<TestComponent>("Test1"); 

, 그냥 구글 "generics C#")

+0

이것은 좋아 보인다! 내가 진짜 빨리 확인하자 :) – redcodefinal

+0

그것은 나에게이 오류를 준다. 암시 적으로 'ConsoleApplication1.Component'유형을 'T'로 변환 할 수 없다. 명시 적 변환이 존재합니다 (캐스트가 누락 되었습니까?) – redcodefinal

+0

오른쪽 캐스트가 없습니다. 결정된. –

관련 문제