Hier ist was ich meine. Angenommen, ich arbeite mit einer API, die Ereignisse verfügbar macht, aber diese Ereignisse folgen nicht der Standard-Signatur EventHandler
oder EventHandler<TEventArgs>
. Ein Ereignis könnte so aussehen, zum Beispiel:Wie kann ich ein IObservable <T> in Rx von einem "nicht standardmäßigen" Ereignis erhalten?
Public Event Update(ByVal sender As BaseSubscription, ByVal e As BaseEvent)
Jetzt, in der Regel, wenn ich eine IObservable<TEventArgs>
von einem Ereignis erhalten möchten, kann ich dies nur tun:
Dim updates = Observable.FromEvent(Of UpdateEventArgs)(_
target:=updateSource, _
eventName:="Update" _
)
Aber das tut nicht Arbeit, weil das Update
Ereignis ist kein EventHandler<UpdateEventArgs>
- tatsächlich ist kein UpdateEventArgs
- es ist im Grunde nur seine eigene Sache.
Offensichtlich konnte ich mein eigenes Klasse Ableiten von EventArgs
(dh UpdateEventArgs
) definieren, schreiben Sie eine andere Klasse das Objekt wickeln Sie das Update
Ereignis bereitstellt, gibt der Wrapper-Klasse seinen eigenenUpdate
Fall, dass ist eine EventHandler<UpdateEventArgs>
, und erhalten Sie eine IObservable<UpdateEventArgs>
von dass. Aber das ist eine nervige Arbeit.
Gibt es eine Möglichkeit, eine IObservable<[something]>
von einem "Nicht-Standard" -Ereignis wie diesem zu erstellen, oder bin ich kein Glück?
UPDATE: obwohl
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))
Ich muss zugeben, ich habe Probleme mit Verpackung: Von Jon Skeet Antwort, ich bin in Richtung der folgenden Überlastung von Observable.FromEvent
stupste mein Kopf um diesen Func(Of EventHandler(Of TEventArgs), TDelegate)
Teil. Es scheint mir rückwärts (?). Offensichtlich gibt es nur etwas, was mir fehlt ...
Wie auch immer, falls es hilft, ich denke, Dies ist, was die entsprechende C# -Code aussehen würde (ich bin ganz ehrlich: Ich bin mir nicht sicher . darüber Auch wenn ich es vorziehen, C selbst im allgemeinen #, ist dieser Code die Arbeit von einem meiner Kollegen, die in erster Linie in VB.NET schreiben, und ermöglicht VB.NET mehrere Syntaxen für die Deklaration von Veranstaltungen):
// 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;
die tricky Teil hier ist, dass es scheint, dass einige Art der Klasse, die von EventArgs
abgeleitet wird, notwendig ist, egal was. In der API, mit der ich arbeite, gibt es keine solche Klasse. Also, absolutes Minimum, ich muss eins schreiben. Aber das sollte ziemlich trivial sein (im Prinzip eine Eigenschaft: BaseEvent
).
Am Ende gehe ich davon aus, den Code für diese Überlastung erforderlich so etwas wie dies in C# aussehen:
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
);
Vorweg: ich habe auch diese gerade? Zweitens: Kann ich richtig sagen, dass es mit VB 9 wirklich keine Möglichkeit gibt, das oben Gesagte zu erreichen, ohne meine eigenen Methoden zu schreiben?
Es fühlt sich für mich fast so an, als würde ich dieses Problem aus dem völlig falschen Winkel heraus angehen. Aber ich bin mir wirklich nicht sicher.
Ihr C# -Beispiel war korrekt, die Vorgehensweise in VB ist identisch, aber die Syntax ist etwas unordentlicher. Sehen Sie sich das Beispiel an, das ich unten für zukünftige Referenz veröffentlicht habe. –