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

如何存储函数与参数延后执行?实现弹窗按钮触发多函数调用

问题描述

假设我定义了以下3个函数:

void A(int i){...}
void B(bool b, string s){...}
void C(float f, double d, char c){...}

在我的应用中,会在特定时机打开一个带有按钮的弹窗,该弹窗拥有一个名为PopupController的控制器,它持有弹窗内所有元素的引用,并包含按钮按下时触发的OnButtonPress()函数。

我的需求是:如何让弹窗按钮执行这3个带指定参数的函数?

...
var popupController = PopupController.CreateInstance();
//希望仅在按钮按下时执行:
A(1);
B(true, "s");
C(1, 2, 'c');

我可以创建任意所需内容来在PopupController中存储这些函数,请问该如何实现?


实现方案

核心思路很简单:把已经绑定好参数的函数封装成无参委托,存在PopupController里,等按钮触发OnButtonPress()时,批量执行这些委托就行。

1. 改造PopupController,添加存储委托的容器

给PopupController新增一个列表存储无参Action,同时对外提供添加操作的接口:

public class PopupController
{
    private List<Action> _buttonActions = new List<Action>();

    // 用于添加按钮触发时要执行的操作
    public void AddOnButtonAction(Action action)
    {
        _buttonActions.Add(action);
    }

    // 按钮按下时的触发逻辑
    public void OnButtonPress()
    {
        foreach (var action in _buttonActions)
        {
            action();
        }
    }

    // 原有实例创建方法
    public static PopupController CreateInstance()
    {
        return new PopupController();
    }
}

2. 绑定参数,将函数注册到PopupController

在创建弹窗的代码中,用Lambda表达式把带参数的函数包装成无参Action,然后添加到控制器的操作列表里:

var popupController = PopupController.CreateInstance();
// 通过Lambda绑定好参数,直接添加到操作列表
popupController.AddOnButtonAction(() => A(1));
popupController.AddOnButtonAction(() => B(true, "s"));
popupController.AddOnButtonAction(() => C(1f, 2.0, 'c'));

额外说明

  • 这里利用了C#的闭包特性,参数会被自动捕获,无需手动处理参数传递问题。
  • 如果需要取消某个操作,可以给PopupController新增RemoveOnButtonAction方法,直接从列表中移除对应的Action。
  • 如果要支持异步操作,只需把Action换成Func<Task>,并在OnButtonPress()中用await逐个执行即可。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:20:32