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)
当尝试创建委托时,我得到一个"错误绑定到目标方法"。当我执行代码时,
- 方法不为空所以它显然可以在 类型中找到方法
- 实例也不为空
请指教。
Thx
S
您的问题在于您传递给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);