返回IQueryable< T>来自泛型方法

本文关键字:泛型方法 IQueryable 返回 | 更新日期: 2023-09-27 18:03:54

所以,我有以下代码:

    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()方法,铸造各种东西,等等。

如果你知道我哪里做错了,我会很感激的。

返回IQueryable< T>来自泛型方法

你的代码中有多个问题:

  1. 你在KeyValuePair<string, IGame>上调用GetType,(因为_gameLookup是一个字典,所以实现了IEnumerable<KeyValuePair<string, IGame>>,它是d的类型),而显然你想在值上使用它。
  2. 在选择集合(games)是IEnumerable<KeyValuePair<string, IGame>>类型之后,因此您需要删除KeyValuePair部分
  3. cast不工作,因为你注意到AsQueryable应该使用。
修复代码:
public IQueryable<T> ListGames<T>() where T : IGame
{
    return _gameLookup.Values
        .OfType<T>()
        .AsQueryable();
}

结果类型是IEnumerable<Type>,您不能将其强制转换为IQueryable<T>(无论如何不是通过简单的强制转换)

你可以试试AsQueryable():

return games.AsQueryable();