【问题标题】:CreateDelegate on Interface method接口方法上的 CreateDelegate
【发布时间】:2011-08-30 22:06:57
【问题描述】:

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

我的代码如下:

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. 实例也不为空

任何指针,请。

谢谢

S

【问题讨论】:

  • 请显示AsyncScraper的声明和对FindScrapeMethod的调用包含参数定义...

标签: c# delegates


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2022-01-23
    • 2011-02-19
    • 1970-01-01
    相关资源
    最近更新 更多