2011-07-30 56 views
1

所以,我有以下代碼:返回的IQueryable <T>從泛型方法

private readonly Dictionary<string, IGame> _gameLookup = new Dictionary<string, IGame>(); 

    public T LookupGame<T>(string name) where T : IGame 
    { 
     if (name == null) throw new ArgumentNullException("name"); 
     Type t = typeof(T); 

     if (_gameLookup.Any(d => d.Key == name)) 
     { 
      return (T)_gameLookup[name]; 
     } 

     var newInstance = (T)AppDomain.CurrentDomain.GetUnityContainer().Resolve(t, name); 

     if (newInstance != null) 
     { 
      _gameLookup.Add(name, newInstance); 

      return newInstance; 
     } 

     return default(T); 
    } 

    public IQueryable<T> ListGames<T>() where T : IGame 
    { 
     var games = _gameLookup.Where(d => d.GetType() == typeof (T)); 

     return (IQueryable<T>) games; 
    } 

我的問題是與ListGames方法。 (LookupGame方法只是包含在某些上下文中,我是doint。)

我不能爲我的生活弄清楚如何操縱事物以獲得IQueryable結果。我已經嘗試了許多東西,包括.AsQueryable()方法,鑄造各種東西等。

任何洞察我要去哪裏錯了,將不勝感激。

+1

爲什麼你需要的IQueryable 而不是IEnumerable的? – Foole

回答

5

有你的代碼中的多個問題:

  1. 您致電GetTypeKeyValuePair<string, IGame>,(因爲_gameLookup是一個字典,所以執行IEnumerable<KeyValuePair<string, IGame>>這是d的類型),而顯然你想在值上使用它。
  2. 選擇後的集合(games)是IEnumerable<KeyValuePair<string, IGame>>類型,所以你需要刪除KeyValuePair部分
  3. 演員正如你指出AsQueryable應使用將無法正常工作。

固定碼:

public IQueryable<T> ListGames<T>() where T : IGame 
{ 
    return _gameLookup.Values 
     .OfType<T>() 
     .AsQueryable(); 
} 
+0

啊...森林穿過樹林。感謝您及時的回覆。 – Nate222

+0

'_gameLookup.Values.AsQueryable ()'似乎更具可讀性? –

+0

MSDN上列出的'AsQueryable '的唯一版本採用'IEnumerable ',但'Values'只實現'IEnumerable ',因此它不會找到像'無法從'System.Collections.Generic .Dictionary .ValueCollection'to'System.Collections.Generic.IEnumerable '' –

0

結果類型爲IEnumerable<Type>,你不能轉換爲IQueryable<T>(不是反正一個簡單的鑄件)

您可以嘗試AsQueryable()

return games.AsQueryable(); 
相關問題