簡體   English   中英

不同屬性的通用foreach循環

[英]Generic foreach loop for different property

我試圖使用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)

這可能嗎?

讓方法接受一個表達式,就像你傳遞它的方法一樣:

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 它提供了此方法所需的所有保證,同時允許更廣泛的可能輸入類型。

你的答案中有答案......你正在使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM