2012-05-09 19 views
13

Estoy usando extensiones RX y WF4 para crear un flujo de trabajo que reaccione a los mensajes observables para avanzar en el flujo de trabajo. Para hacer esto, traigo un objeto que contiene un IObservable (ModuleMessage es mi clase abstracta). El problema que tengo es que .Subscribe no reconoce ninguno de sus métodos de extensión, a saber, el de lambda extpressions/method groups. En el siguiente código, tengo referencias:Falta IObservable <>. Métodos de extensión de suscripción

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

Y también la siguiente línea de código:

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 el error de tiempo de compilación de:

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 

por favor, esto el código se ha adaptado de una muestra y no se ha extrapolado a mi gusto, estoy totalmente preocupado por el problema que tenemos entre manos. No soy partidario de RX o WF4, pero he usado suscribirse de esta manera en cualquier otra parte de la misma solución. He agregado RX a este proyecto a través de NuGet.

Editar: el siguiente error si uso como un grupo de métodos (en lugar de lambda):

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

¿Puedes compartir un enlace a la muestra que mencionaste? Esto se ve bastante interesante. Siempre pensé que los Observables no eran serializables, así que ¿cómo puedes usarlos dentro de un flujo de trabajo que necesita soporte para la persistencia en cualquier momento? – julealgon

+0

Esto fue hace tanto tiempo, ni siquiera puedo recordar. Creo que nunca llegué a ese punto antes de distraerme con algo brillante (este era un proyecto personal) – Sprague

Respuesta

28

que se está perdiendo esta:

using System; 

Ese es el espacio de nombres que contiene la clase estática ObservableExtensions con todos los métodos de extensión Subscribe.

Los métodos de extensión se "descubren" a través de las directivas using (así como la jerarquía del espacio de nombres del código que intenta usarlos).

+2

¡Gracias! Esto no es obvio ... Desearía que hubiera un error mejor. Supongo que ese es el precio que pagamos por los métodos de extensión = (estoy usando ReSharper, por lo general me atrapa estas cosas. Debe ser la existencia de otro .Subscribe que impide el descubrimiento. – Sprague

+0

Es un problema completamente no obvio. Suscribirse tomando IObserver es lo que detectará Visual Studio. Por lo tanto, los métodos de extensión no se recogerán. –

+2

Desafortunadamente, este problema parece perjudicar a aquellos de nosotros que quitamos más espacios de nombres innecesarios. Lástima ... – Sprague

Cuestiones relacionadas