如何存储函数与参数延后执行?实现弹窗按钮触发多函数调用
问题描述
假设我定义了以下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
相关产品推荐
相关产品推荐

