Comment utiliser une expression avec un générique func lambda dans une clause linq where?

c# expression-trees lambda linq

Question

Voici ce que j'ai

private readonly Dictionary<Type, List<object>> _cache;

public IList<T> Get<T> (Expression<Func<T, bool>> criteria)
{
    return _cache[typeof(T)].Where (criteria);
}

Le compilateur se plaint (à juste titre) qu'il ne peut pas convertir d'objet en T.

Comment dois-je procéder à partir de là?


Solution

return _cached[type].AsQueryable().Cast<T>().Where (criteria).ToList()

L'idée est d'avoir la liste comme un IQueryable et ensuite je pourrais Cast ...

Réponse acceptée

Utilisez la méthode d'extension .Cast<>() :

private readonly Dictionary<Type, List<object>> _cache;

public IList<T> Get<T> (Expression<Func<T, bool>> criteria)
{
    return _cache[typeof(T)].Cast<T>().Where (criteria).ToList();
}

Si vous n'êtes pas absolument sûr que tous les éléments sont de type T, vous pouvez utiliser .OfType<T>() (qui ignore les éléments qui ne peuvent pas être convertis).

Modifier Vous devez également utiliser .OfType<T>() lorsque T est un valuetype (struct).

Modifier Depuis votre commentaire mentionné IQueryable, cela pourrait aider à :

return _cache[typeof(T)].AsQueryable().Cast<T>().Where (criteria).ToList();

Réponse populaire

Ok, corrigé:

return _cached[type].AsQueryable().Cast<T>().Where (criteria).ToList()

L'idée est d'avoir la liste comme un IQueryable et ensuite je pourrais Cast ...




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi