C# 不同属性的泛型foreach循环
我试图为foreach循环使用一个通用方法,该方法将传递不同的参数作为参数 在下面的示例中,我希望传递不同的参数(EmployeeDisplayOrder或EmployeeEnrollOrder)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
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);