Ako vytvoriť vlastné rozšírenie pre reaktívne rozšírenia - c #, .net, extension-methods, system.reactive

Nie je ťažké nájsť príklad ako vytvoriť vlastnú metódu rozšírenia LINQ, Ale nemôžem nájsť príklad, ako vytvoriť vlastnú metódu rozšírenia Rx.

Môže mi niekto poukázať na zdroj alebo ukázať príklad? Používam posledný (ver 2.2.5).

Mám záujem o vytvorenie vlastného "Cast" alebo vlastného "Select". Môžem odrážať zdrojový kód existujúcich rozšírení a stále to nie je zrejmé.

Vďaka.

odpovede:

5 pre odpoveď č. 1

Najbežnejší spôsob implementácie vlastných rozšírení v Rx (okrem zostavovania existujúcich operácií) je cez Observable.Create, Odvtedy je to veľmi vhodné Create stará sa o celý rad obáv, že nie je triviálne, aby sa sami pustili.

Urobíte to, nezabudnite stráviť Rx Design Guidelines ktoré vysvetľujú pravidlá a konvencie, ktoré by ste mali dodržiavať - ​​mnohé z nich Observable.Create stará sa o vás.

Tu je príklad Cast realizácie:

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));
}
}

Dala som to tak, ako je, pretože požiadavka dvojitého obsadenia nie je zrejmá (vlastne IEnumerable"s Cast robí to isté, z rovnakého dôvodu). Môžete urobiť toto vylepšenie, aby ste znížili typové argumenty na jeden, vzhľadom na to, že object cast je nevyhnutné:

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));
}
}

Môžete sa pozrieť na IntroToRx pre niektoré ďalšie Observable.Create tiež.


Súvisiace otázky