You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:46:48