2012-05-09 9 views
13

Utilizzo estensioni RX e WF4 per creare un flusso di lavoro che reagisce ai messaggi osservabili per far avanzare il flusso di lavoro. Per fare questo, porto un oggetto contenente un IObservable (ModuleMessage è la mia classe astratta). Il problema che sto avendo è che .Subscribe non riesce a riconoscere nessuno dei suoi metodi di estensione, cioè quello per estrapolazioni lambda/gruppi di metodi. Nel codice seguente, ho riferimenti:IObservable <> mancante. Metodi di estensione sottoscrizione

using System.Activities; 
using System.Activities.Hosting; 
using System.Collections.Generic; 
using System.Reactive.Linq; 

E anche la seguente riga di codice:

internal void AddModuleCallback(IModule module) 
    { 
     if (!addedCallback) 
     { 
      addedCallback = true; 
      module.Messages.Where(m => m is MemberLeftModuleMessage || m is MemberRemovedModuleMessage).Subscribe(m => this.OnMemberExit(m)); // This line errors 
     } 
    } 

    internal void OnMemberExit(ModuleMessage message) 
    { 
     // Gizmo was fired, resume the bookmark 
     this.instance.BeginResumeBookmark(
      new Bookmark(ModuleVisit.BookmarkName), 
      message is MemberLeftModuleMessage, 
      r => this.instance.EndResumeBookmark(r), 
      null); 
    } 

con l'errore in fase di compilazione di:

Error 1 Cannot convert lambda expression to type 'System.IObserver<Components.Messages.ModuleMessage>' because it is not a delegate type <Removed>\WaitForModuleVisitExtension.cs 34 119 Components 

Attenzione, questa il codice è adattato da un campione e non è stato preso in considerazione a mio piacimento, sono solo preoccupato del problema in questione. Non sono un professionista con RX o WF4, ma ho usato la sottoscrizione in questo modo altrove nella stessa soluzione. Ho aggiunto RX a questo progetto tramite NuGet.

Edit: il seguente errore se uso come gruppo il metodo (invece di lambda):

Error 2 Argument 1: cannot convert from 'method group' to 'System.IObserver<Components.Messages.ModuleMessage>' <removed>\WaitForModuleVisitExtension.cs 34 119 Components 
+0

Puoi condividere un link all'esempio che hai menzionato? Questo sembra abbastanza interessante. Ho sempre pensato che gli Observable non fossero serializzabili, quindi come puoi usarli all'interno di un flusso di lavoro che richiede supporto per la persistenza in qualsiasi momento? – julealgon

+0

Questo è stato tanto tempo fa, non riesco nemmeno a ricordare. Penso di non essere mai arrivato a quel punto prima di essere distratto da qualcos'altro lucido (questo era un progetto personale) – Sprague

risposta

28

ti manca questo:

using System; 

Questo è il namespace che contiene la classe statica ObservableExtensions con tutti i metodi di estensione Subscribe.

I metodi di estensione vengono "scoperti" tramite le direttive using (così come la gerarchia dello spazio dei nomi del codice che tenta di utilizzarli).

+2

Grazie! Questo non è ovvio ... Vorrei che ci fosse un errore migliore. Suppongo che questo sia il prezzo che paghiamo per i metodi di estensione = (sto usando ReSharper, di solito cattura queste cose per me. Deve esserci l'esistenza di un altro .Subscribe che impedisce la scoperta. – Sprague

+0

È un problema completamente non ovvio. Iscriviti prendendo IObserver è quello che Visual Studio rileverà, quindi i metodi di estensione non verranno raccolti –

+2

Sfortunatamente, questo problema sembra ferire chi di noi rimuove gli spazi dei nomi non necessari di più! Peccato ... – Sprague

Problemi correlati