在use块的持续时间内订阅事件

在use块的持续时间内订阅事件

我经常遇到以下代码:

myService.SomeEvent += listener;
myService.DoSomething();
myService.SomeEvent -= listener;


很好,但是如果我们能以更好的方式做到这一点,那就太好了。我正在考虑做类似的事情:

using(EventScope.Start(myService.SomeEvent, listener)){
    myService.DoSomething();
}


不幸的是,这被C#禁止,因为myService.SomeEvent只能出现在+ =或-=的左侧(有充分的理由)。我的问题是我还有什么其他选择?理想情况下,我希望这是类型安全的,它可以排除反射并执行以下操作(我已经实现了):

using(EventScope.Start(myService, "SomeEvent", listener){
    myService.DoSomething();
}


需要明确的是,我对使用“ using”语法并不满意,可以争论地说这是该语言的一种变形。其他选项将不胜感激!

最佳答案

也许可以使用更简洁的语法来做到这一点,但是如果您有这样的结构……

public struct ActionDisposable : IDisposable
{
    private readonly Action _action;

    public ActionDisposable(Action action)
    {
        _action = action;
    }

    public void Dispose()
    {
        _action();
    }
}


...以及类似的方法:

public static IDisposable EventScope(Action subscribe, Action unsubscribe)
{
    subscribe();
    return new ActionDisposable(unsubscribe);
}


这样就可以编写如下代码:

using (EventScope(() => myService.SomeEvent += listener, () => myService.SomeEvent -= listener))
{
    myService.DoStuff();
}


或像这样:

myService.SomeEvent += listener
using (new ActionDisposable(() => myService.SomeEvent -= listener))
{
    myService.DoStuff();
}

关于c# - 在use块的持续时间内订阅事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/988188/

10-13 07:57