C# 接口方法上的CreateDelegate

C# 接口方法上的CreateDelegate,c#,delegates,C#,Delegates,我很难看出我在创建接口方法的委托时出错的地方 我的代码如下: private static Func<HtmlDocument, IObservable<IData>> FindScrapeMethod(ICrawlerStrategy crawler, string scrapeDelegate) { Func<HtmlDocument, IObservable<IData>> action; var fullDelegateNa

我很难看出我在创建接口方法的委托时出错的地方

我的代码如下:

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;
}
private static Func FindScrapeMethod(ICrawlerStrategy爬虫、字符串爬虫委托)
{
Func行动;
var fullDelegateName=String.Format(“ICrawlerStrategy.{0}”,scrapedegate);
if(!\u delegateCache.TryGetValue(fullDelegateName,out操作))
{                
var method=typeof(ICrawlerStrategy).GetMethod(scrapedegate,BindingFlags.Public | BindingFlags.Instance);
动作=(Func)
CreateDelegate(typeof(Func),crawler,method);
_delegateCache.Add(fullDelegateName,action);
}
返回动作;
}
接口声明是

public interface ICrawlerStrategy 
{        
    Func<HtmlDocument, IObservable<IData>> ExtractorAsync();
}
公共接口ICrawler策略
{        
Func ExtractorAsync();
}
实现类如下所示

public class MyCrawler : ICrawlerStrategy
{

    <snip>

    Func<HtmlDocument, IObservable<IData>> ICrawlerStrategy.ExtractorAsync()
    {
        return (doc) => AsyncScraper(doc); 
    }
}
公共类MyCrawler:icrawler策略
{
funct ICrawlerStrategy.ExtractorAsync()
{
返回(单据)=>返回(单据);
}
}
Edit1-根据@Yahia的要求:

public IObservable<IData> AsyncScraper(HtmlDocument page)
public IObservable异步刮刀(HtmlDocument页)
当尝试创建委托时,我得到一个“错误绑定到目标方法”。当我步进代码时

  • 该方法不为null,因此它显然可以在类型上找到该方法
  • 实例也不是空的
  • 有什么建议吗

    Thx


    S

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

    函数的返回值为

    Func<HtmlDocument, IObservable<IData>>
    
    Func
    
    因此,您的委托类型为

    Func
    
    因此,更改这一行(您还必须修复其他行以匹配)

    action=(Func)
    CreateDelegate(typeof(Func),crawler,method);
    
    请显示
    AsyncScraper
    的声明,调用包括
    FindScrapeMethod
    的参数定义。。。
    Func<Func<HtmlDocument, IObservable<IData>>>
    
    action = (Func<Func<HtmlDocument, IObservable<IData>>>)
              Delegate.CreateDelegate(typeof(Func<Func<HtmlDocument, IObservable<IData>>>), crawler, method);