Ciclo foreach generico per proprietà diverse
-
21-12-2019 - |
Domanda
Sto cercando di utilizzare un metodo generico per il ciclo foreach che passerebbe parametri diversi come argomento.
Nell'esempio seguente vorrei passare parametri diversi (EmployeeDisplayOrder o 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);
}
}
Mi piacerebbe avere qualcosa del genere
public void UpdateEmployeeOrders(ICollection<Employee> employee)
{
foreach( var emp in employees)
{
UpdateSpecificEmployeeOrder(employee.id, //generic property);
}
}
e chiamare questo metodo generico UpdateEmployeeOrders da SaveEmployeeDisplayOrder e SaveEmployeeEnrollOrder.
Firma del metodo per UpdateSpecificEmployeeOrder
UpdateSpecificEmployeeOrder( int employeeid, params Expression<Func<Employee, object>>[] property)
È possibile?
Soluzione
Hai la risposta nella tua risposta ... stai usando Lambdas ... quindi passa un delegato nel tuo metodo.
public void SaveEmployeeDisplayOrder<T>(ICollection<Employee> employees, Func<Employee, T> fetchProperty)
{
//some code
foreach( var employee in employees)
{
UpdateSpecificEmployeeOrder(employee.id, fetchProperty(employee));
}
}
.
Allora lo chiameresti simile a ciò che hai avuto:
SaveEmployeeDisplayOrder(employees, e => e.EmployeeDisplayOrder);
.
o
SaveEmployeeDisplayOrder(employees, e => e.EmployeeEnrollOrder);
. Altri suggerimenti
Chiedi al metodo di accettare un'espressione, proprio come fa il metodo a cui la stai passando:
public class Foo
{
public void UpdateEmployeeOrders(IEnumerable<Employee> employees,
Expression<Func<Employee, object>> selector)
{
foreach (var employee in employees)
{
UpdateSpecificEmployeeOrder(employee.id, selector);
}
}
}
Inoltre, poiché è l'unica cosa con cui abbiamo mai fatto employees
viene ripetuto su di esso, possiamo digitare il parametro come IEnumerable
invece di ICollection
.Fornisce tutte le garanzie di cui questo metodo ha bisogno, consentendo al tempo stesso una gamma più ampia di possibili tipi di input.