CreateDelegate на метод интерфейса - PullRequest
3 голосов
/ 31 августа 2011

Я изо всех сил пытаюсь понять, в чем я ошибаюсь при создании делегата для метода интерфейса

Мой код выглядит следующим образом:

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

S

1 Ответ

7 голосов
/ 31 августа 2011

Ваша проблема в типе, который вы передаете 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...