So erstellen Sie eine benutzerdefinierte Erweiterung für reaktive Erweiterungen - c #, .net, extension-methods, system.reactive

Es ist nicht schwer, ein Beispiel zu finden wie Sie eine benutzerdefinierte LINQ-Erweiterungsmethode erstellen. Ich kann jedoch kein Beispiel dafür finden, wie eine benutzerdefinierte Rx-Erweiterungsmethode erstellt werden kann.

Kann mich jemand auf eine Ressource hinweisen oder ein Beispiel veröffentlichen? Ich benutze das neueste (ver 2.2.5).

Ich bin daran interessiert, eine benutzerdefinierte "Cast" oder benutzerdefinierte "Select" zu machen. Ich kann den Quellcode der vorhandenen Erweiterungen widerspiegeln, und es ist immer noch nicht offensichtlich.

Vielen Dank.

Antworten:

5 für die Antwort № 1

Die gebräuchlichste Methode zum Implementieren von benutzerdefinierten Erweiterungen in Rx (außer dem Erstellen vorhandener Operationen) ist via Observable.Create. Es ist sehr ratsam, dies seit dem zu tun Create kümmert sich um eine Vielzahl von Bedenken, dass es nicht trivial ist, sich selbst zu implementieren.

Wie auch immer du es tust, sei dir sicher, es zu verdauen die Rx Design Richtlinien welche die Regeln und Konventionen erklären, denen Sie folgen sollten - viele davon Observable.Create kümmert sich um dich.

Hier ist ein Beispiel Cast Implementierung:

public static class ObservableExtensions
{
public static IObservable<TResult> Cast<TSource, TResult>(
this IObservable<TSource> source)
{
return Observable.Create<TResult>(o =>
source.Subscribe(x => {
TResult cast;
try
{
cast = (TResult)(object)x;
}
catch (InvalidCastException ex)
{
o.OnError(ex);
return;
}
o.OnNext(cast);
},
o.OnError,
o.OnCompleted));
}
}

Ich stelle dies so dar, weil die Doppelbesetzung nicht offensichtlich ist IEnumerable"s Cast tut das gleiche, aus dem gleichen Grund). Sie können diese Optimierung vornehmen, um die Typargumente auf eins zu reduzieren, da der object Besetzung ist notwendig:

public static class ObservableExtensions
{
public static IObservable<TResult> Cast<TResult>(
this IObservable<object> source)
{
return Observable.Create<TResult>(o =>
source.Subscribe(x => {
TResult cast;
try
{
cast = (TResult)x;
}
catch (InvalidCastException ex)
{
o.OnError(ex);
return;
}
o.OnNext(cast);
},
o.OnError,
o.OnCompleted));
}
}

Sie können es sich ansehen IntroToRx für etwas mehr auf Observable.Create auch.


Verwandte Fragen