gpt4 book ai didi

c# - 接口(interface)方法上的 CreateDelegate

转载 作者:行者123 更新时间:2023-11-30 14:16:36 25 4
gpt4 key购买 nike

在创建接口(interface)方法的委托(delegate)时,我正在努力寻找哪里出错了

我的代码如下:

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

接口(interface)声明是

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)

当尝试创建委托(delegate)时,我收到“错误绑定(bind)到目标方法”。当我执行代码时,

  1. 方法不为null所以显然可以找到类型上的方法
  2. 实例也不为空

任何指针,请。

谢谢

小号

最佳答案

您的问题在于您传递给 CreateDelegate 的类型。

你的函数的返回值是

Func<HtmlDocument, IObservable<IData>>

因此您的委托(delegate)的类型是

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

因此更改此行(您还必须修复其他行才能匹配)

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

关于c# - 接口(interface)方法上的 CreateDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7250373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com