これが私の言いたいことです。イベントを公開する API を使用しているとしますが、これらのイベントは標準EventHandler
またはEventHandler<TEventArgs>
署名に従っていません。たとえば、1 つのイベントは次のようになります。
Public Event Update(ByVal sender As BaseSubscription, ByVal e As BaseEvent)
IObservable<TEventArgs>
通常、イベントからを取得したい場合は、次のようにします。
Dim updates = Observable.FromEvent(Of UpdateEventArgs)( _
target:=updateSource, _
eventName:="Update" _
)
しかし、これは機能しません。なぜなら、Update
イベントはEventHandler<UpdateEventArgs>
、実際にはありませんUpdateEventArgs
。基本的には、それ自体が独自のものであるからです。
明らかに、(つまり)から派生する独自のクラスを定義し、イベントを提供するオブジェクトをラップする別のクラスを作成し、ラッパー クラスに である独自のイベントを与え、そのからを取得することができます。しかし、それは面倒な作業量です。EventArgs
UpdateEventArgs
Update
Update
EventHandler<UpdateEventArgs>
IObservable<UpdateEventArgs>
IObservable<[something]>
このような「非標準」イベントから作成する方法はありますか、それとも運が悪いのでしょうか?
更新:Jon Skeet の回答から、次のオーバーロードの方向に突き進んでいますObservable.FromEvent
:
Function FromEvent(Of TDelegate, TEventArgs As EventArgs)( _
conversion As Func(Of EventHandler(Of TEventArgs), TDelegate), _
addHandler As Action(Of TDelegate), _
removeHandler As Action(Of TDelegate) _
) As IObservable(Of IEvent(Of TEventArgs))
Func(Of EventHandler(Of TEventArgs), TDelegate)
ただし、その部分について頭を悩ませていることは認めざるを得ません。私には逆に見えます(?)。明らかに、私には欠けているものがあります...
とにかく、それが役立つ場合、これは同等の C# コードがどのように見えるかだと思います (私は完全に正直に言うと、これについてはよくわかりません。私は一般的に C# を好みますが、このコードは 1 つの作業です私の同僚は主に VB.NET で書いており、VB.NET ではイベントを宣言するための複数の構文が許可されています):
// notice: not an EventHandler<TEventArgs>
public delegate void UpdateEventHandler(BaseSubscription sender, BaseEvent e);
// not 100% sure why he did it this way
public event UpdateEventHandler Update;
ここで注意が必要なのは、なんらかのクラスから派生する必要があるように見えることEventArgs
です。私が使用している API には、そのようなクラスはありません。だから、最低限、私はそれを書く必要があります。しかし、それはかなり些細なことです (基本的に 1 つのプロパティ: BaseEvent
)。
最終的に、このオーバーロードに必要なコードは C# では次のようになると思います。
var updates = Observable.FromEvent<UpdateEventHandler, UpdateEventArgs>(
// conversion (Func<EventHandler<UpdateEventArgs>, UpdateEventHandler>)
handler => (sender, e) => handler(sender, new UpdateEventArgs(e)),
// addHandler (Action<UpdateEventHandler>)
handler => updateSource.Update += handler,
// removeHandler (Action<UpdateEventHandler>)
handler => updateSource.Update -= handler
);
まず第一に、私はこれをまっすぐに持っていますか?第二に、VB 9 を使用すると、独自のメソッドを作成せずに上記を達成する方法は本当にないというのは正しいですか?
そもそも、まったく間違った角度からこの問題に取り組んでいるような気がします。しかし、私は本当によくわかりません。