返回IQueryable <t>从通用方法</t>

时间:2011-07-30 00:06:14

标签: c# generics iqueryable

所以,我有以下代码:

    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方法只是包含在我正在做的事情的某些上下文中。)

我不能为我的生活弄清楚如何操纵事物来获得一个可以获得智商的结果。我尝试了很多东西,包括.AsQueryable()方法,投射各种东西等等。

任何洞察我出错的地方都将不胜感激。

2 个答案:

答案 0 :(得分:5)

您的代码中存在多个问题:

  1. 您在GetType上致电KeyValuePair<string, IGame>,(因为_gameLookup是一个字典,所以实现IEnumerable<KeyValuePair<string, IGame>>它是d的类型,而显然你想要在价值观上使用它。
  2. 选择集合(games)后的类型为IEnumerable<KeyValuePair<string, IGame>>,因此您需要删除KeyValuePair部分
  3. 演员阵容无效,因为您应该使用AsQueryable
  4. 固定代码:

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

答案 1 :(得分:0)

结果类型为IEnumerable<Type>,您无法转换为IQueryable<T>(不是通过简单的转换)

您可以尝试AsQueryable()

return games.AsQueryable();