【问题标题】:Returning IQueryable<T> From Generic Method从通用方法返回 IQueryable<T>
【发布时间】:2011-07-30 00:06:14
【问题描述】:

所以,我有以下代码:

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

我一生都无法弄清楚如何操纵事物以获得 IQueryable 结果。我尝试了很多东西,包括 .AsQueryable() 方法、转换各种东西等。

任何对我哪里出错的见解将不胜感激。

【问题讨论】:

  • 为什么需要 IQueryable 而不是 IEnumerable

标签: c# generics iqueryable


【解决方案1】:

您的代码中有多个问题:

  1. 你在KeyValuePair&lt;string, IGame&gt; 上调用GetType,(因为_gameLookup 是一个字典,所以实现IEnumerable&lt;KeyValuePair&lt;string, IGame&gt;&gt; 它是d 的类型),而显然你想在值上使用它。
  2. 选择集合后(games)是IEnumerable&lt;KeyValuePair&lt;string, IGame&gt;&gt;类型所以你需要删除KeyValuePair部分
  3. 演员表无法正常工作,正如您所说,应该使用 AsQueryable

固定代码:

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

【讨论】:

  • 啊...森林穿过树林。感谢您的快速回复。
  • MSDN 上列出的唯一AsQueryable&lt;T&gt; 版本采用IEnumerable&lt;T&gt;,但Values 仅实现IEnumerable&lt;IGame&gt;,因此它不会找到带有cannot convert from 'System.Collections.Generic.Dictionary&lt;string,UserQuery.IGame&gt;.ValueCollection' to 'System.Collections.Generic.IEnumerable&lt;T&gt;' 之类错误的重载
【解决方案2】:

结果类型是IEnumerable&lt;Type&gt;,您不能将其转换为IQueryable&lt;T&gt;(无论如何都不能通过简单的转换)

你可以试试AsQueryable():

return games.AsQueryable();

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2010-10-02
    • 1970-01-01
    • 2018-12-08
    相关资源
    最近更新 更多