2011-03-19 4 views
2

내가 인터페이스를 구현 유형에 대한 특정 네임 스페이스를 스캔, 오히려 단지 형식보다는 그 인터페이스로를 반환하기 위해 노력하고있어에 GetTypes()를 캐스팅 할 수 없습니다,하지만 난 InvalidCastException이는 인터페이스

IEnumerable<IGameScript> GetDemos() 
{ 
    var results = Assembly.GetExecutingAssembly().GetTypes() 
     .Where(
     x => x.IsClass 
     && x.Namespace == "MMOClass.CodeBase.Demos" 
     && x.Name.Contains("Demo") 
     && x.GetInterfaces().Contains(typeof(IGameScript)) 
     ).Select(x => x); 

    return results.Cast<IGameScript>(); 
} 
을 받고 있어요 리드의 대답에 응답

업데이트 :

IEnumerable<IGameScript> GetDemos() 
{ 
    var results = Assembly.GetExecutingAssembly().GetTypes() 
     .Where(
     x => x.IsClass 
     && x.Namespace == "MMOClass.CodeBase.Demos" 
     && x.Name.Contains("Demo") 
     && x.GetInterfaces().Contains(typeof(IGameScript)) 
     ).Select(x => Activator.CreateInstance(x) as IGameScript); 

    return results; 
} 

답변

7

귀하의 LINQ 쿼리 인터페이스를 구현 유형 (IEnumerable<System.Type>)의 컬렉션을 반환하지 않는 콜 그 유형의 물건들.

그러나 IEnumerable<IGameScript>을 반환하려고합니다. 해당 인터페이스를 구현하는 객체의 인스턴스의 목록이됩니다. 인터페이스 자체로 전송하려면 인스턴스를 생성해야합니다.

1

이 같은 간단한 개혁에게, 당신은 기본 생성자가 당신의 선택 LINQ 통화를 할 수 있습니다 가정 실제로 해당 유형의 인스턴스 수 :

.Select(x => Activator.CreateInstance(x))