【问题标题】:Action with pre prepered parameters使用预先准备好的参数的操作
【发布时间】:2021-12-31 00:33:27
【问题描述】:

我想使用预先准备好的参数(调用时没有参数)注册一些动作/委托/事件或类似的东西。 例如

public Action actions;

public void Main()
{
    actions += Add(12);
    actions += Show("something");
    actions += Calculate(2, 4);
    actions?.Invoke();
}

public void Add(int k) { }
public void Show(string s) { }
public void Calculate(int k, int c) { }

或者是这样的:

public void Main()
{
    actions += Add(12);
    actions += Add(1);
    actions += Add(4);
    actions?.Invoke();
}

有可能吗?

【问题讨论】:

  • 你可以有一个动作列表...添加到它,然后循环并调用每一个。类似:public List<Action> actions = new(); 添加到它,actions.Add(()=> Add(12));,不确定语法,在移动设备上。
  • 然后执行它们foreach(var a in actions){ a.Invoke();}

标签: c# events delegates action


【解决方案1】:

当您在调用它之前知道一个、多个或所有参数时,您始终可以使用ActionsFuncs 更改接口。对于Funcs,您还需要匹配返回类型。

void Do(string s) => Console.WriteLine(s);
void Do(string s, string ss) => Console.WriteLine($"{s} - {ss}");

Action do1 = () => Do("hello");
Action do2 = () => Do("hello", "world");

do1(); // "hello"
do2(); // "hello - world"

如果你想得到一个列表,那么像往常一样创建列表并对其进行迭代并单独调用它们。

  var list = new List<Action>{do1, do2};
  list.ForEach(action => action()); // ["hello","hello - world"]

【讨论】:

  • 想解释一下-1吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
相关资源
最近更新 更多