2011-03-19 30 views
2

我掃描特定的命名空間實現的接口類型,並試圖將它們返還作爲接口,而不僅僅是類型,但我得到一個InvalidCastException無法施展GetTypes()到接口

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)) 
相關問題