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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top