不同属性的通用foreach循环

Ell*_*Ell 3 c# generics foreach generic-method generic-collections

我试图使用foreach循环的泛型方法,它将传递不同的参数作为参数.

在下面的这个例子中,我想传递不同的参数(EmployeeDisplayOrder或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);
   }
}
Run Code Online (Sandbox Code Playgroud)

我想要这样的东西

public void UpdateEmployeeOrders(ICollection<Employee> employee)
{ 
  foreach( var emp in employees)
  {
    UpdateSpecificEmployeeOrder(employee.id, //generic property);
  }
}
Run Code Online (Sandbox Code Playgroud)

并从SaveEmployeeDisplayOrder和SaveEmployeeEnrollOrder调用此UpdateEmployeeOrders泛型方法.

UpdateSpecificEmployeeOrder的方法签名

UpdateSpecificEmployeeOrder( int employeeid, params Expression<Func<Employee, object>>[] property)
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Ser*_*rvy 10

让方法接受一个表达式,就像你传递它的方法一样:

public class Foo
{
    public void UpdateEmployeeOrders(IEnumerable<Employee> employees,
         Expression<Func<Employee, object>> selector)
    {
        foreach (var employee in employees)
        {
            UpdateSpecificEmployeeOrder(employee.id, selector);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,由于我们唯一要做的employees就是迭代它,我们可以输入参数IEnumerable而不是ICollection.它提供了此方法所需的所有保证,同时允许更广泛的可能输入类型.