2012-05-09 21 views
13

İş akışını ilerlemek için gözlemlenebilir iletilere yanıt veren bir iş akışı oluşturmak için RX uzantıları ve WF4 kullanıyorum. Bunu yapmak için, bir IObservable içeren bir nesneyi getiriyorum (soyut sınıfım olan ModuleMessage). Sahip olduğum sorun şu ki .Subscribe, uzantı yöntemlerini, yani lambda extresions/method grupları için herhangi birini tanımakta başarısız oluyor. AyrıcaIObservable <> eksik .Subscribe uzantı yöntemleri

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

Ve şu kod satırı: bir derleme zamanı hatası ile

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

:

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 

unutmayın, bu aşağıdaki kodda, referansları var Kod bir örneklemden uyarlanmıştır ve benim beğenime dahil edilmemiştir, sadece eldeki problemle ilgileniyorum. Ben RX veya WF4 ile profesyonel değilim, ama aynı çözümde başka bir şekilde bu şekilde abone kullandım. Bu projeye NuGet üzerinden RX ekledim. Ben (yerine lambda) bir yöntem grup olarak kullanırsanız aşağıdaki hata:

Düzenleme

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

Bahsettiğiniz örneğe bir bağlantı paylaşır mısınız? Bu oldukça ilginç görünüyor. Ben her zaman Gözlenebilirlerin serileştirilemediğini düşündüm, bu yüzden onları herhangi bir zamanda sebat için desteğe ihtiyaç duyan bir iş akışında nasıl kullanabilirsiniz? – julealgon

+0

Bu çok uzun zaman önceydi, hatırlayamıyorum bile. Parlak bir şey tarafından dikkati dağılmadan önce bu noktaya hiç gelmediğimi düşünüyorum (bu kişisel bir proje idi) – Sprague

cevap

28

Bu eksik:

ObservableExtensions statik sınıfını içeren ad var
using System; 

tüm Subscribe uzantısı yöntemleri ile.

Uzantı yöntemleri, using yönergeleriyle (ayrıca bunları kullanmaya çalışan kodun ad alanı hiyerarşisi) "keşfedilir".

+2

Teşekkürler! Bu belli değil ... Keşke daha iyi bir hata olsaydı. Uzatma yöntemleri için ödediğimiz bedel budur = (ReSharper kullanıyorum, genellikle bu şeyleri benim için yakalar. Başka birisinin bulunması gerekir. Keşfedilmeyi engelleyen bir abonelik. – Sprague

+0

Tamamen açık bir sorun değil. IObserver'ı almayı unutmayın , Visual Studio'nun algılayacağı yöntemdir. Bu nedenle, uzantı yöntemleri alınmayacaktır. –

+2

Ne yazık ki, bu sorun en çok ihtiyaç duyulan ad alanlarını kaldıranları incitmiş gibi görünüyor! Çok kötü ... – Sprague

İlgili konular