单次活动订阅

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)

Tho*_*que 4

重构扩展方法并不容易,因为在 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)