我是活动和代表的新手。我想知道是否可以将事件的返回值存储在列表中。
我有一个看起来像这样的事件:
public delegate CartItem AddItemToCart();
public event AddItemToCart OnCollect;
现在每次用户按下按钮时都会触发OnCollect事件。我需要在列表中存储订阅OnCollect的方法的所有返回的CartItems。我的方法:
List<CartItem> items = new List<CartItem> ();
itmes.Add(OnCollect());
然而(预期的那样)这不起作用。那么如何读出返回值?
答案 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} }。