因此,我阅读了MSDN和Stack Overflow。我了解Action Delegate的一般操作,但是无论我做多少示例,它都不会单击。通常,代表的想法也是如此。所以这是我的问题。当您具有这样的功能时:
public GetCustomers(Action<IEnumerable<Customer>,Exception> callBack)
{
}
这是什么,我应该传递给它什么?
最佳答案
它期望一个带有IEnumerable和Exception并返回void的函数。
void SendExceptionToCustomers(IEnumerable<Customer> customers, Exception ex) {
foreach(var customer in customers)
customer.SendMessage(ex.Message);
}
GetCustomers(SendExceptionToCustomers);
顺便说一句,GetCustomers似乎是该函数的一个糟糕名称-它要求执行操作,因此它更像DoSomethingToCustomers
编辑以回应评论
好吧,这里发生的是调用方可以指定一些操作。假设GetCustomers是这样实现的:
public void GetCustomers(Action<Enumerable<Customer>, Exception> handleError) {
Customer[] customerlist = GetCustomersFromDatabase();
try {
foreach(var c in customerList)
c.ProcessSomething()
} catch (Exception e) {
handleError(customerList, e);
}
}
那么您可以从命令行程序中的某个位置调用Getcustomers,并将其传递给
GetCustomers((list, exception) => {
Console.WriteLine("Encountered error processing the following customers");
foreach(var customer in list) Console.WriteLine(customer.Name);
Console.WriteLine(exception.Message);
});
例如,您可以从远程应用程序调用GetCustomers并将其传递
Getcustomers((list, exception) => {
// code that emails me the exception message and customer list
})
另外,Slak的评论提出了委托(delegate)参数的另一个原因-GetCustomers确实检索了客户,但异步地。无论何时完成检索客户,如果发生异常,它都会使用customerlist或异常调用您赋予它的函数。
关于c# - 请说明.NET代表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2474439/