3

我正在尝试对 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);
   }
}

我想要这样的东西

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

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

UpdateSpecificEmployeeOrder 的方法签名

UpdateSpecificEmployeeOrder( int employeeid, params Expression<Func<Employee, object>>[] property)

这可能吗?

4

2 回答 2

10

让该方法接受一个表达式,就像您将其传递给的方法一样:

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

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

于 2014-01-08T21:02:46.600 回答
1

你的答案中有答案......你正在使用 lambdas......所以在你的方法中传递一个委托。

public void SaveEmployeeDisplayOrder<T>(ICollection<Employee> employees, Func<Employee, T> fetchProperty)
{
   //some code

   foreach( var employee in employees)
   {
      UpdateSpecificEmployeeOrder(employee.id, fetchProperty(employee));
   }
}

然后你会称之为类似于你所拥有的:

SaveEmployeeDisplayOrder(employees, e => e.EmployeeDisplayOrder);

或者

SaveEmployeeDisplayOrder(employees, e => e.EmployeeEnrollOrder);
于 2014-01-08T21:04:54.547 回答