从通用方法返回IQueryable <T>

Nat*_*222 1 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;
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是ListGames方法.(LookupGame方法只是包含在我正在做的事情的某些上下文中.)

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

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

Jul*_*lia 5

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

  1. 你调用GetType了一个KeyValuePair<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();
}
Run Code Online (Sandbox Code Playgroud)