从对象列表中调用公共函数

时间:2017-07-21 13:20:45

标签: c#

我正在尝试创建一个Proxy Scraper。对于我拥有的每个网站,我都试图抓住代理。每个网站的scrape代码都在一个带有网站名称的类中。

例如:

我有网站" wwww.proxy.com和www.moreproxy.com"

我有两个类:Proxy和MoreProxy的功能" scrape"因两者而异(因为它们是不同的网站)。

要获得列表,我会这样做:

//The below code doesn't exist, but just to get my point across
//Each datagrid.Add is in a separate thread
datagrid.Add(new Proxy().scrape());
datagrid.Add(new MoreProxy().scrape());
datagrid.Add(...);
datagrid.Add(...);
//And so on for all the other websites I might add...

现在有办法循环吗?我正在尝试这样的东西,但它不起作用:

List<object> objects = new List<object>();
objects.Add(new Proxy(), new MoreProxy(), ..., ...); //I can update this each time I add a new website

foreach(object o in objects)
{
    datagrid.Add(o.scrape());
}

scrape函数看起来像这样:

public List<string[]> scrape()
{
        HtmlDocument PageContent = new HtmlWeb().Load("https://free-proxy-list.net/");
        HtmlNode[] nodes = PageContent.DocumentNode.SelectNodes("//td").ToArray();

        List<string[]> proxies = new List<string[]>();

        for (int i = 0; i < nodes.Length; i += 8)
        {
            string[] proxy = { nodes[i].InnerHtml, nodes[i + 1].InnerHtml };
            proxies.Add(proxy);
        }

        return proxies;
}

这样的事情存在吗?基本上我有几个类具有共同的功能刮。我想创建一个所有这些类的列表作为对象,并执行函数scrape。我该怎么做(解决方案需要线程安全)

2 个答案:

答案 0 :(得分:0)

设置界面:

public interface IScrape()
{
   object Scrape();
}

让你的代理类实现接口:

// repeat for Proxy
public class MyProxy : IScrape{
  object Scrape()
  {
     return something;
  }
}

然后

List<IScrape> objects = new List<IScrape>();
objects.Add(new Proxy(), new MoreProxy(), ..., ...); //I can update this each time I add a new website

foreach(IScrape o in objects)
{
    datagrid.Add(o.Scrape());
}

答案 1 :(得分:0)

接口是问题的解决方案。

像这样:

public interface IScrapable {
    void Scrape();
}

public class Proxy : IScrapeable {
    public void Scrape() { ...}
}

现在你可以循环并刮擦你的物体了。

 List<IScrapable> objects = new List<IScrapable>();
objects.Add(new Proxy(), new MoreProxy(), ..., ...); //I can update this each time I add a new website

foreach(IScrapable o in objects)
{
    datagrid.Add(o.scrape());
}

这应该做你想要的。