创建一个返回泛型函数的函数

Creating a function that returns a generic function

提问人:chrisg229 提问时间:11/10/2022 最后编辑:Theodor Zouliaschrisg229 更新时间:11/11/2022 访问量:77

问:

obj1.Event接受.Func<CancellationToken,Task>

这工作原理:

obj1.Event += async _ =>
{
    try
    {
        await function1(stoppingToken);
    }
    catch (Exception ex)
    {
        Log.Error(ex.ToString());
    }
};

如何创建一个返回泛型函数 ex 的函数?

obj1.Event += HandleEvent(function1(stoppingToken))
obj2.Event += HandleEvent(function2(stoppingToken))
obj3.Event += HandleEvent(function3(stoppingToken))

也许接近这一点,但这行不通!

public Func<CancellationToken, Task> HandleEvent<T???>(Func<T> ????)
{
    return func;
}
C# 泛型 事件 委托 任务

评论

0赞 Johnathan Barclay 11/10/2022
该怎么办?即,您将如何将一个没有参数的函数转换为一个接受 a 并返回的函数?HandleEventTCancellationTokenTask
0赞 chrisg229 11/10/2022
理想情况下,HandleEvent 将接受大约 10 个函数中的任何一个,每个函数都具有 CancellationToken 作为参数,并将 Func<CancellationToken, Task> 返回给事件。
0赞 chrisg229 11/10/2022
Jonathan,你能告诉我函数签名应该是什么样子吗?
0赞 Johnathan Barclay 11/10/2022
那么所有你想传递的函数也都返回了吗?只是为了包试的目的。抓住?TaskHandleEvent
0赞 chrisg229 11/10/2022
从本质上讲,我只想要一种有效的方法,将 10-20 个不同的函数都以单个 CancellationToken 作为其唯一参数传递到需要此 Func<CancellationToken,Task> 的事件中。我认为,如果我能弄清楚,某种类型的通用委托可能是最有效的方法!

答:

2赞 Johnathan Barclay 11/10/2022 #1

如果你的函数都接受一个参数并返回一个,它应该很简单,如下所示:CancallationTokenTask

obj1.Event += function1;
obj2.Event += function2;
obj3.Event += function3;

请注意,当被调用时,它会将自己的函数传递到您的函数中。EventCancellationToken

如果要改为传递实例,可以按如下方式创建闭包:stoppingToken

obj1.Event += _ => function1(stoppingToken);
obj2.Event += _ => function2(stoppingToken);
obj3.Event += _ => function3(stoppingToken);

如果你需要调用额外的代码(例如,你在问题中),你可以这样做:try..catch

public Func<CancellationToken, Task> HandleEvent(Func<CancellationToken, Task> func)
{
    return async cancellationToken =>
    {
        try
        {
            await func(cancellationToken);
        }
        catch (Exception ex)
        {
            Log.Error(ex.ToString());
        }
    }
}

// Using token from Event
obj1.Event += HandleEvent(function1);
obj2.Event += HandleEvent(function2);
obj3.Event += HandleEvent(function3);

// Using stoppingToken
obj1.Event += HandleEvent(_ => function1(stoppingToken));
obj2.Event += HandleEvent(_ => function2(stoppingToken));
obj3.Event += HandleEvent(_ => function3(stoppingToken));