在列表中存储事件返回值?

时间:2018-04-07 19:19:31

标签: c# events delegates

我是活动和代表的新手。我想知道是否可以将事件的返回值存储在列表中。

我有一个看起来像这样的事件:

public delegate CartItem AddItemToCart();
public event AddItemToCart OnCollect;

现在每次用户按下按钮时都会触发OnCollect事件。我需要在列表中存储订阅OnCollect的方法的所有返回的CartItems。我的方法:

List<CartItem> items = new List<CartItem> ();
itmes.Add(OnCollect());

然而(预期的那样)这不起作用。那么如何读出返回值?

1 个答案:

答案 0 :(得分:0)

你可以,但它有点难看。您可以使用Delegate.GetInvocationList检索各个代理,每个代理与组合代理的代理类型相同。例如:

List<CartItem> items = new List<CartItem>();
foreach (AddItemToCart individual in OnCollect.GetInvocationList())
{
    items.Add(individual.Invoke());
}

或者我猜你可以使用LINQ:

List<CartItem> items = OnCollect
    .GetInvocationList()
    .Cast<AddItemCart>()
    .Select(d => d.Invoke())
    .ToList();

请注意,这将每次创建一个新列表,但每个订阅处理程序都有一个元素。如果您需要将所有项目合并多次执行此操作,则需要List<CartItem> 字段(例如allItems),然后您可以调用{{1} }。