是否有一种通用方法来定义既不接收 Action 也不接收 Func<Task> 的方法?

我有一个方法,通过在另一个方法之前和之后运行一些逻辑来A包装另一个方法的执行。B该方法B可以是任务,也可以不是。因此,为了能够await在该方法B执行任务时,我必须实现两次该A方法,如下所示:


public async Task A(int id, Action<int> b)

{

    try

    {

        await BeforeAsync(id);

        b(id);

        await AfterAsync(id);

    }

    catch (Exception ex)

    {

        Handle(ex, id);

    }

}


public async Task A(int id, Func<int,Task> b)

{

    try

    {

        await BeforeAsync(id);

        await b(id);

        await AfterAsync(id);

    }

    catch (Exception ex)

    {

        Handle(ex, id);

    }

}

有没有办法避免重复?


潇潇雨雨
浏览 111回答 3
3回答

智慧大石

事实并非如此,假设一些愚蠢的事情,比如传递一个对象并使用强制转换计数来测试它:)那这个呢?public&nbsp;Task&nbsp;A(int&nbsp;id,&nbsp;Action<int>&nbsp;b)&nbsp;=>&nbsp;A(id,&nbsp;x&nbsp;=>&nbsp;{&nbsp;b(a);&nbsp;return&nbsp;Task.CompletedTask;&nbsp;});这样你就不会重复代码。

湖上湖

使用 RX 观察者模式实现。source.Subscribe(o => Log.Write($"On Next {o}"));或者如果您指定其他前置条件和后置条件source&nbsp; .Do(_ => Log.Write("Before"))&nbsp; .Finally(()=> Log.Write("After"))&nbsp; .Subscribe(&nbsp; &nbsp; o => Log.Write($"On Next {o}"),&nbsp; &nbsp; exception => Log.Write($"On Error {exception}")&nbsp; &nbsp; () => Log.Write("On Completed"));问题在于try{&nbsp; &nbsp; await BeforeAsync(id);&nbsp; &nbsp; b(id);&nbsp; &nbsp; await AfterAsync(id);}是你会假设下面的 Catch 实际上会捕获所有异常,但事实并非如此,并且只有当你等待或等待它时才会发生。简而言之,正确地做到这一点要复杂得多。

慕尼黑8549860

就在这里:public async Task A(int id, Delegate b){&nbsp; &nbsp; try&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; await BeforeAsync(id);&nbsp; &nbsp; &nbsp; &nbsp; if (b.DynamicInvoke(id) is Task task) await task;&nbsp; &nbsp; &nbsp; &nbsp; await AfterAsync(id);&nbsp; &nbsp; }&nbsp; &nbsp; catch (Exception ex)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Handle(ex, id);&nbsp; &nbsp; }}但现在你失去了类型安全(因为你可以通过任何委托)并且一无所获。Task.Run有 8 个重载是有原因的: https ://referencesource.microsoft.com/#q=task.run
打开App,查看更多内容
随时随地看视频慕课网APP