C# 不同属性的泛型foreach循环

C# 不同属性的泛型foreach循环,c#,generics,foreach,generic-collections,generic-method,C#,Generics,Foreach,Generic Collections,Generic Method,我试图为foreach循环使用一个通用方法,该方法将传递不同的参数作为参数 在下面的示例中,我希望传递不同的参数(EmployeeDisplayOrder或EmployeeEnrollOrder) public void saveemployeedisplayerder(ICollection employees) { //一些代码 foreach(员工中的var emp) { UpdateSpecificEmployeeOrder(employee.id,e=>e.EmployeeDispla

我试图为foreach循环使用一个通用方法,该方法将传递不同的参数作为参数

在下面的示例中,我希望传递不同的参数(EmployeeDisplayOrder或EmployeeEnrollOrder)

public void saveemployeedisplayerder(ICollection employees)
{
//一些代码
foreach(员工中的var emp)
{
UpdateSpecificEmployeeOrder(employee.id,e=>e.EmployeeDisplayOrder);
}
}
公共作废SaveEmployeeEnrollOrder(ICollection员工)
{
//一些代码
foreach(员工中的var emp)
{
UpdateSpecificEmployeeOrder(employee.id,e=>e.EmployeeEnrollOrder);
}
}
我想要这样的

public void UpdateEmployeeOrders(ICollection<Employee> employee)
{ 
  foreach( var emp in employees)
  {
    UpdateSpecificEmployeeOrder(employee.id, //generic property);
  }
}
public void UpdateEmployeeOrders(ICollection员工)
{ 
foreach(员工中的var emp)
{
UpdateSpecificEmployeeOrder(employee.id,//通用属性);
}
}
并从SaveEmployeeDisplayOrder和SaveEmployeeEnrollOrder调用此UpdateEmployeeOrders通用方法

UpdateSpecificEmployeeOrder的方法签名

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

这是可能的吗?

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

public class Foo
{
    public void UpdateEmployeeOrders(IEnumerable<Employee> employees,
         Expression<Func<Employee, object>> selector)
    {
        foreach (var employee in employees)
        {
            UpdateSpecificEmployeeOrder(employee.id, selector);
        }
    }
}
公共类Foo
{
public void UpdateEmployeeOrders(IEnumerable employees,
表达式选择器)
{
foreach(员工中的var员工)
{
UpdateSpecificEmployeeOrder(employee.id,选择器);
}
}
}

此外,由于我们对
员工所做的唯一一件事就是对其进行迭代,因此我们可以将参数键入
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));
   }
}


UpdateSpecificEmployeeOrder
的第二个参数的类型是什么
string
int
,还有其他的吗?它似乎不是
int
,它似乎是某种delagate,形式为
Func
。让我们假设这是Employee类。Public class Employee{Public int id;Public int EmployeeDisplayOrder;Public int EmployeeEnrollOrder;}我不在乎EmployeeEnrollOrder是什么样子,我想知道前两个示例中的方法签名
UpdateSpecificEmployeeOrder(int id,?参数)
中的
是什么。是
Func
Func
表达式
,还是什么?@Ell-code在注释中不起作用。编辑成你的问题。@ScottChamberlain目前我们不知道
UpdateSpecificEmployeeOrder
是什么样子。我假设它本身是泛型的,所以它可以按原样工作。如果它的选择器需要特定类型,则需要在此处添加相同的约束,是的。因为您传递的选择器接受
员工
,并将其传递给仅具有
id
属性的函数,
UpdateSpecificEmployeeOrder
如何让员工使用选择器?你不需要传递员工而不仅仅是id吗?@Harrison在OP提供的前两个代码示例中,
UpdateSpecificEmployeeOrder
是如何做到的?@Harrison谁知道呢。这就是OP中的代码所使用的,我只是简单地匹配了一下。谢谢大家。成功了。我必须确保UpdateSpecificEmployeeOrder的方法签名是相同的。在这里,不可能通过e=>e.EmployeeDisplayerOrder,如下SaveEmployeeDisplayerOrder(employees,e=>e.EmployeeDisplayerOrder);因为EmployeeDisplayOrder是employee的属性,employee是一个集合。但是
e
是集合
employees
中的单个
employees
谢谢!成功了。我必须确保UpdateSpecificEmployeeOrder的方法签名是相同的。
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);