如何在 Rx 中创建一个 Observable "channel"?

How to create an Observable "channel" in Rx?

我开始使用 Reactive Extensions 将我的推 -> 拉桥转换为更简单的结构。

所以现在我有一个带有(私人)事件的 class,以及从中创建的 Observable

class WithEvents {
   public class MyEvent {}
   private delegate void MyEventHandler(MyEvent e);
   private event MyEventHandler EventRaised;

   Public IObservable<MyEvent> TheEvents;

   public void Foo() {
      EventRaised(new MyEvent());
   }

}

事实是,这个事件在这里似乎是不需要的脚手架。所以我想知道:有没有办法构建一个 'bare' Observable,我可以只 'push' 事件?

class WithChannel {
    public class MyEvent {}
    public IObservable<MyEvent> EventRaised {get} = new Channel<MyEvent>();

    public void Foo() {
       ((Channel)EventRaised).DoNext(new MyEvent());
    }
}

是的,有一个名为 Subject 的东西(在 System.Reactive.Subjects 命名空间中)正是这样做的:

class WithChannel {
    public class MyEvent {
    }

    private readonly Subject<MyEvent> _event;

    public WithChannel() {
        _event = new Subject<MyEvent>();
    }

    public IObservable<MyEvent> EventRaised => _event;

    public void Foo() {
        _event.OnNext(new MyEvent());
    }
}

通常不推荐使用 subjects,但对于这个特定任务,我认为它很好。