C # méthode accepter un prédicat - ce que cela semble ok?
-
18-09-2019 - |
Question
Je voudrais une méthode qui a l'API suivante:
//get all users with a role of admin
var users = myRepository.GetUsers(u => u.Role == Role.Admin);
est quelque chose comme ce travail?
IList<User> GetUsers(Func<User, bool> predicate)
{
var users = GetAllUsers();
return users.Where(predicate).ToList();
}
Si oui, je wil être en mesure de préciser les prédicats plus complexes tels que ( pseudocode ):
myRepository.GetUsers(u => u.CreatedDate is upto 14 days old);
La solution
Cela semble tout à fait bien. Toutefois, si vous souhaitez utiliser le prédicat avec quelque chose comme LINQ to SQL, vous voulez utiliser:
IList<User> GetUsers(Expression<Func<User, bool>> predicate)
Cela signifie que l'expression lambda sera converti en un arbre d'expression au lieu d'un délégué -. Et cet arbre d'expression peut ensuite être converti en SQL
Autres conseils
Oui, cela fonctionnera.
Ce que vous dites le compilateur est que vous allez passer une fonction qui fonctionne sur un objet User
, et retourne un bool
- ce que la fonction ressemble est entièrement à vous. Vous pouvez obtenir des trucs de nidification assez complexe en utilisant ORS (||
) et (ANDS) &&
aussi, mais si elle est trop difficile de voir ce que le prédicat fait, vous devriez probablement envisager refactoring.
Mais en fait tout lambda qui prend par exemple u
comme objet User
, et le transforme en une expression qui retourne bool
fonctionnera.
Une astuce:. Vous pouvez utiliser prédicats