Générique boucle foreach pour les différents biens
-
21-12-2019 - |
Question
Je suis en train d'utiliser une méthode générique pour la boucle foreach qui permettrait de passer les différents paramètre que l'argument.
Dans cet exemple ci-dessous je voudrais passer les différents paramètres(EmployeeDisplayOrder ou EmployeeEnrollOrder)
public void SaveEmployeeDisplayOrder(ICollection<Employee> employees)
{
//some code
foreach( var emp in employees)
{
UpdateSpecificEmployeeOrder(employee.id, e => e.EmployeeDisplayOrder);
}
}
public void SaveEmployeeEnrollOrder(ICollection<Employee> employees)
{
//some code
foreach( var emp in employees)
{
UpdateSpecificEmployeeOrder(employee.id, e => e.EmployeeEnrollOrder);
}
}
Je voudrais avoir quelque chose comme ceci
public void UpdateEmployeeOrders(ICollection<Employee> employee)
{
foreach( var emp in employees)
{
UpdateSpecificEmployeeOrder(employee.id, //generic property);
}
}
et d'appeler cette UpdateEmployeeOrders méthode générique de SaveEmployeeDisplayOrder et SaveEmployeeEnrollOrder.
Signature de la méthode pour UpdateSpecificEmployeeOrder
UpdateSpecificEmployeeOrder( int employeeid, params Expression<Func<Employee, object>>[] property)
Est-ce possible?
La solution
Vous avez la réponse dans votre réponse ... Vous utilisez Lambdas ... alors passez un délégué dans votre méthode.
public void SaveEmployeeDisplayOrder<T>(ICollection<Employee> employees, Func<Employee, T> fetchProperty)
{
//some code
foreach( var employee in employees)
{
UpdateSpecificEmployeeOrder(employee.id, fetchProperty(employee));
}
}
alors vous l'appelleriez semblable à ce que vous aviez:
SaveEmployeeDisplayOrder(employees, e => e.EmployeeDisplayOrder);
ou
SaveEmployeeDisplayOrder(employees, e => e.EmployeeEnrollOrder);
Autres conseils
Avoir de la méthode d'accepter une expression, tout comme la méthode que vous êtes en passant qu'il n':
public class Foo
{
public void UpdateEmployeeOrders(IEnumerable<Employee> employees,
Expression<Func<Employee, object>> selector)
{
foreach (var employee in employees)
{
UpdateSpecificEmployeeOrder(employee.id, selector);
}
}
}
Aussi, puisque la seule chose que nous jamais faire avec employees
est itérer dessus, nous pouvons saisir le paramètre que IEnumerable
au lieu de ICollection
.Il offre toutes les garanties que cette méthode doit, tout en permettant à un plus large éventail de types d'entrée possibles.