spe*_*der 12 c# events boilerplate
我相信这是不可能的,但我会问.
为了对事件进行单次订阅,我经常发现自己使用这种(自我发明的)模式:
EventHandler handler=null;
handler = (sender, e) =>
{
SomeEvent -= handler;
Initialize();
};
SomeEvent += handler;
Run Code Online (Sandbox Code Playgroud)
这是相当多的锅炉板,它也使Resharper对改装后的瓶盖抱怨.有没有办法将此模式转换为扩展方法或类似方法?这样做的更好方法是什么?
理想情况下,我喜欢这样的东西:
SomeEvent.OneShot(handler)
Run Code Online (Sandbox Code Playgroud)
重构扩展方法并不容易,因为在 C# 中引用事件的唯一方法是订阅 ( +=) 或取消订阅 ( -=)(除非它在当前类中声明)。
您可以使用与响应式扩展中相同的方法:Observable.FromEvent使用两个委托来订阅事件并取消订阅。所以你可以这样做:
public static class EventHelper
{
public static void SubscribeOneShot(
Action<EventHandler> subscribe,
Action<EventHandler> unsubscribe,
EventHandler handler)
{
EventHandler actualHandler = null;
actualHandler = (sender, e) =>
{
unsubscribe(actualHandler);
handler(sender, e);
};
subscribe(actualHandler);
}
}
...
Foo f = new Foo();
EventHelper.SubscribeOneShot(
handler => f.Bar += handler,
handler => f.Bar -= handler,
(sender, e) => { /* whatever */ });
Run Code Online (Sandbox Code Playgroud)