2012-05-09 9 views
13

Ich verwende RX-Erweiterungen und WF4, um einen Workflow zu erstellen, der auf beobachtbare Nachrichten reagiert, um den Workflow zu verbessern. Dazu bringe ich ein Objekt ein, das ein IObservable enthält (ModuleMessage ist meine abstrakte Klasse). Das Problem, das ich habe, ist, dass .Subscribe keine seiner Erweiterungsmethoden erkennt, nämlich die für Lambda-Komprimierungen/Methodengruppen. Im folgenden Code habe ich Referenzen:IObservable <> fehlende .Subscribe-Erweiterungsmethoden

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

Und auch die folgende Codezeile:

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

Mit dem Fehler bei der Kompilierung von:

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 

Bitte beachten Sie, dass diese Code ist aus einer Probe angepasst und wurde nicht nach meinem Geschmack ausgeklammert, ich bin nur besorgt über das Problem zur Hand. Ich bin kein Profi mit RX oder WF4, habe aber auf diese Weise woanders in derselben Lösung abonniert. Ich habe RX über NuGet zu diesem Projekt hinzugefügt.

Edit: der folgende Fehler, wenn ich als Methodengruppe (anstelle von Lambda) verwenden:

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

Können Sie einen Link zu der von Ihnen erwähnten Stichprobe freigeben? Das sieht ziemlich interessant aus. Ich dachte immer, dass Observables nicht serialisierbar sind, also wie können Sie sie in einem Workflow verwenden, der zu jedem Zeitpunkt Unterstützung für die Persistenz benötigt? – julealgon

+0

Das war so lange her, ich kann mich nicht einmal erinnern. Ich denke, dass ich nie zu diesem Punkt gekommen bin, bevor ich durch etwas anderes glänzendes abgelenkt wurde (das war ein persönliches Projekt) – Sprague

Antwort

28

Sie verpassen dies:

using System; 

, dass der Namespace die ObservableExtensions statische Klasse enthalten ist mit allen Subscribe Erweiterungsmethoden.

Erweiterungsmethoden werden über die Direktiven using "entdeckt" (sowie die Namespace-Hierarchie des Codes, der versucht, sie zu verwenden).

+2

Danke! Das ist nicht offensichtlich ... Ich wünschte es gäbe einen besseren Fehler. Ich nehme an, das ist der Preis, den wir für Erweiterungsmethoden zahlen = (Ich benutze ReSharper, normalerweise fängt es diese Dinge für mich ein. Es muss die Existenz eines anderen .Subscribe sein, der die Entdeckung verhindert. – Sprague

+0

Es ist ein völlig nicht offensichtliches Problem. 1 –

+2

Unglücklicherweise scheint dieses Problem diejenigen von uns zu verletzen, die die dringendsten Namespaces am meisten entfernen! Zu schlecht ... – Sprague

Verwandte Themen