gpt4 book ai didi

c# - 在 using block 的持续时间内订阅一个事件

转载 作者:行者123 更新时间:2023-11-30 21:24:51 24 4
gpt4 key购买 nike

我经常遇到下面的代码:

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# - 在 using block 的持续时间内订阅一个事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/988188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com