返回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()方法,铸造各种东西,等等。
如果你知道我哪里做错了,我会很感激的。
你的代码中有多个问题:
- 你在
KeyValuePair<string, IGame>
上调用GetType
,(因为_gameLookup
是一个字典,所以实现了IEnumerable<KeyValuePair<string, IGame>>
,它是d
的类型),而显然你想在值上使用它。 - 在选择集合(
games
)是IEnumerable<KeyValuePair<string, IGame>>
类型之后,因此您需要删除KeyValuePair
部分 - cast不工作,因为你注意到
AsQueryable
应该使用。
public IQueryable<T> ListGames<T>() where T : IGame
{
return _gameLookup.Values
.OfType<T>()
.AsQueryable();
}
结果类型是IEnumerable<Type>
,您不能将其强制转换为IQueryable<T>
(无论如何不是通过简单的强制转换)
你可以试试AsQueryable()
:
return games.AsQueryable();