命名 Action<T> 参数? (单值元组?)

问题描述 投票:0回答:1

因此,如果我想在回调中包含多个参数,我可以使用值元组为它们命名(用于上下文),同时仍然使用通用 Action 委托。

像这样:


public async void WaitUntilAbleToGetValue(Action<(float value, float timeSpentWaiting)> then)
{
    // await something that takes a while, keep track of time spent waiting
    // get value
           
    then?.Invoke((value: myValue, timeSpentWaiting: myTimeElapsed));
}

这很棒,因为它允许我们以非常简略的方式向这些操作参数添加上下文。无需声明自定义委托或结构类型...就这样。

所以我尝试对单个参数执行相同的操作...并且我收到错误 CS8124 说元组必须至少有两个元素...所以

Action<(T myValue)>
显然不起作用...这是一个真是耻辱。

(仅供参考,这是 C# 9 iirc.. 这是 Unity 2021 使用的)

所以我想在这里问,是否有人知道如何命名这样的回调参数,而不必经历声明自定义委托类型之类的麻烦。

是的,我很懒。是的,我正在寻找那种甜蜜的语法糖。

提前致谢!

干杯

c# callback tuples
1个回答
-1
投票

如果您正在寻找一种在不定义特殊委托或结构的情况下向单个回调参数添加上下文的方法,您可能会考虑的一种方法是使用命名参数。

第一种方法:

public async void WaitUntilAbleToGetValue(Action<float> then)
{
    // await something that takes a while, keep track of time spent waiting
    // get value

    then?.Invoke(myValue); // Here, 'myValue' is the argument name for clarity
}

当调用WaitUntilAbleToGetValue时:

WaitUntilAbleToGetValue(value => DoSomethingWithValue(value));

第二种方法:

public async void WaitUntilAbleToGetValue(Action<KeyValuePair<string, float>> then)
{
    // await something that takes a while, keep track of time spent waiting
    // get value

    then?.Invoke(new KeyValuePair<string, float>("myValue", myValue));
}
© www.soinside.com 2019 - 2024. All rights reserved.