如何将C#事件的返回值存储到列表中?
解决事件多播委托返回值收集问题
嘿,你遇到的这个问题其实是多播委托的一个常见特性——直接调用事件委托的时候,只会返回最后一个订阅该事件的方法的返回值,所以你的items.Add(OnCollect())只能拿到最后一个结果,没法收集所有订阅方法的返回值。
要实现收集所有返回值的需求,你需要手动遍历事件委托的调用列表,逐个调用每个订阅的方法,然后把每个返回值都加到列表里。下面是具体的实现步骤:
第一步:安全触发事件并收集返回值
在按钮点击的处理方法里,先检查事件是否有订阅者(避免空引用异常),然后通过GetInvocationList()获取所有订阅的委托,逐个调用并收集结果:
private void Button_Click(object sender, EventArgs e) { List<CartItem> items = new List<CartItem>(); // 先检查事件是否有订阅者,避免NullReferenceException if (OnCollect != null) { // 获取所有订阅的委托列表 Delegate[] delegates = OnCollect.GetInvocationList(); foreach (AddItemToCart del in delegates) { // 逐个调用每个订阅方法,收集返回值 CartItem item = del.Invoke(); if (item != null) // 可选:过滤掉null的返回值 { items.Add(item); } } } // 现在items里就有所有订阅方法返回的CartItem了 // 后续可以处理这个列表,比如展示、保存等 }
第二步:示例订阅方法
为了验证效果,你可以写几个订阅这个事件的示例方法:
// 订阅事件的方法1 private CartItem AddBookToCart() { return new CartItem { Name = "C#入门指南", Price = 59.9m }; } // 订阅事件的方法2 private CartItem AddPenToCart() { return new CartItem { Name = "美工钢笔", Price = 29.9m }; } // 在初始化的时候订阅事件 public YourForm() { InitializeComponent(); OnCollect += AddBookToCart; OnCollect += AddPenToCart; }
补充说明
- 一定要在触发事件前检查
OnCollect != null,如果没有任何订阅者,直接调用会抛出空引用异常;或者你也可以用空合并运算符简化:OnCollect?.GetInvocationList(),但遍历的时候还要注意处理null的情况。 - 如果某个订阅方法可能返回
null,记得在收集的时候做判断,避免把null加到列表里(根据你的业务需求决定)。
内容的提问来源于stack exchange,提问作者Mycom
相关产品推荐
相关产品推荐

