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

标签 c# delegates

在创建接口(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/

相关文章:

c# - System.Windows.Media.Color 到颜色名称

ios - Swift 委托(delegate)和协议(protocol)不起作用

c# - 尝试获取 webhook 请求时出现索引超出范围异常,我该如何解决

c# - 返回属性名首字母小写的json

C# 如何等待返回 Task<dynamic> 的方法?

c# - 在 C# 中追加到文本文件中

.net - c# 中事件和委托(delegate)的替代方法是什么?

objective-c - super 响应选择器 : returns true but actually calling super (selector) gives "unrecognized selector sent to instance"

macos - 在 OS X 中使用委托(delegate)

ios - 从另一个类捕获 View 中的事件