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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top