Come creare un'estensione personalizzata per le estensioni reattive - c #, .net, extension-methods, system.reactive

Non è difficile trovare un esempio di come creare un metodo di estensione LINQ personalizzato. Ma non riesco a trovare un esempio di come creare un metodo di estensione Rx personalizzato.

Qualcuno può indicarmi una risorsa o pubblicare un esempio? Sto usando l'ultimo (ver 2.2.5).

Sono interessato a creare un "Cast" personalizzato o una "selezione" personalizzata. Posso riflettere il codice sorgente delle estensioni esistenti, ed è ancora non ovvio.

Grazie.

risposte:

5 per risposta № 1

Il modo più comune per implementare estensioni personalizzate in Rx (oltre alla composizione di operazioni esistenti) è tramite Observable.Create. È altamente consigliabile farlo in questo modo da allora Create si prende cura di una serie di preoccupazioni che è non banale implementare te stesso.

Comunque lo fai, assicurati di digerirlo le linee guida Rx Design che spiega le regole e le convenzioni che dovresti seguire, molte delle quali Observable.Create si prende cura di te.

Ecco un esempio Cast implementazione:

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

L'ho messo così com'è, perché il requisito del doppio cast non è ovvio (in realtà IEnumerable"S Cast fa la stessa cosa, per lo stesso motivo). Puoi fare questo tweak per ridurre gli argomenti di tipo a uno, dato che il object il cast è necessario:

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

Puoi dare un'occhiata a IntroToRx per altri ancora Observable.Create pure.


domande correlate