我经常遇到以下代码:
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/