因此,我阅读了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/

10-11 18:49