2011-08-30 71 views
3

我掙扎,看到我錯了WRT創建一個委託接口方法createDelegate方法的接口方法

我的代碼如下:

private static Func<HtmlDocument, IObservable<IData>> FindScrapeMethod(ICrawlerStrategy crawler, string scrapeDelegate) 
{ 
    Func<HtmlDocument, IObservable<IData>> action; 
    var fullDelegateName = String.Format("ICrawlerStrategy.{0}", scrapeDelegate); 

    if (!_delegateCache.TryGetValue(fullDelegateName, out action)) 
    {     
     var method = typeof(ICrawlerStrategy).GetMethod(scrapeDelegate, BindingFlags.Public | BindingFlags.Instance); 

     action = (Func<HtmlDocument, IObservable<IData>>) 
        Delegate.CreateDelegate(typeof(Func<HtmlDocument, IObservable<IData>>), crawler, method); 
     _delegateCache.Add(fullDelegateName, action);    
    } 

    return action; 
} 

接口聲明

public interface ICrawlerStrategy 
{   
    Func<HtmlDocument, IObservable<IData>> ExtractorAsync(); 
} 

執行類如下

public class MyCrawler : ICrawlerStrategy 
{ 

    <snip> 

    Func<HtmlDocument, IObservable<IData>> ICrawlerStrategy.ExtractorAsync() 
    { 
     return (doc) => AsyncScraper(doc); 
    } 
} 

EDIT1 - 作爲的要求@Yahia:

public IObservable<IData> AsyncScraper(HtmlDocument page) 

當試圖創建委託我得到一個「錯誤綁定到目標方法」。當我踏上代碼,

  1. 方法不爲空,因此它可以明顯發現該方法的類型
  2. 的實例也是不爲空,以及

任何指針,請。

THX

小號

+0

請顯示'AsyncScraper'的聲明和調用incl ude參數定義爲'FindScrapeMethod' ... – Yahia

回答

7

你的問題是,你傳遞給createDelegate方法的類型。

你的函數的返回值是

Func<HtmlDocument, IObservable<IData>> 

因此您委託的類型是

Func<Func<HtmlDocument, IObservable<IData>>> 

因此改變這一行(你必須修復他人,以及相匹配)

action = (Func<Func<HtmlDocument, IObservable<IData>>>) 
      Delegate.CreateDelegate(typeof(Func<Func<HtmlDocument, IObservable<IData>>>), crawler, method); 
+0

看起來像這樣做的竅門!許多thx Corey! –