CreateDelegate on Interface method

本文关键字:method Interface on CreateDelegate | 更新日期: 2023-09-27 18:07:10

我正在努力看看我在哪里出错创建一个委托接口方法

我的代码如下:
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. 类型中找到方法
  3. 实例也不为空

请指教。

Thx

S

CreateDelegate on Interface method

您的问题在于您传递给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);