使用代理搜索更好的解决方案

时间:2011-03-02 15:01:13

标签: c# delegates

嘿所有, 我是C#的新手,并对我的案例的更好解决方案感到好奇。

我有一个方法,它将DataTable作为参数,并使用MyClass的变量创建一个List并返回它。

public static List<Campaigns> GetCampaignsList(DataTable DataTable)
    {
        List<Campaigns> ListCampaigns = new List<Campaigns>();

        foreach (DataRow row in DataTable.Rows)
        {
            Campaigns Campaign = new Campaigns();

            Campaign.CampaignID = Convert.ToInt32(row["CampaignID"]);
            Campaign.CustomerID = Convert.ToInt32(row["CustomerID"]);
            Campaign.ClientID = Convert.ToInt32(row["ClientID"]);
            Campaign.Title = row["Title"].ToString();
            Campaign.Subject = row["Subject"].ToString();
            Campaign.FromName = row["FromName"].ToString();
            Campaign.FromEmail = row["FromEmail"].ToString();
            Campaign.ReplyEmail = row["ReplyEmail"].ToString();
            Campaign.AddDate = Convert.ToDateTime(row["AddDate"]);
            Campaign.UniqueRecipients = Convert.ToInt32(row["UniqueRecipients"]);
            Campaign.ClientReportVisible = Convert.ToBoolean(row["ClientReportVisible"]);
            Campaign.Status = Convert.ToInt16(row["Status"]);

            ListCampaigns.Add(Campaign);
        }

        return ListCampaigns;
    }

我的另一个DataTable方法从给定参数的数据库中获取DataTable。这是方法。

public static DataTable GetNewCampaigns()
    {
        DataTable dtCampaigns = new DataTable();

        Campaigns Campaigns = new Campaigns();
        dtCampaigns = Campaigns.SelectStatus(0);

        return dtCampaigns;
    }

但问题是,这个GetNewCampaigns方法不接受参数,但其他方法可以接受参数。例如,当我尝试选择具有CampaignID的广告系列时,我必须将CampaignID作为参数发送。这些所有数据库方法都将返回类型作为DataTable,但参数数量不同。

public static DataTable GetCampaignDetails(int CampaignID)
    {
        DataTable dtCampaigns = new DataTable();

        Campaigns Campaigns = new Campaigns();
        dtCampaigns = Campaigns.Select(CampaignID);

        return dtCampaigns;
    }

最后,我想将一个Delegate传递给我的第一个GetCampaignList方法作为参数,该参数将决定调用哪个Database方法。我不想将DataTable作为参数传递,因为它是新手编程。

你能不能帮助我学习一些更高级的功能。 我搜遍了它并得到了Func&lt;&gt;代表但无法提出解决方案。

2 个答案:

答案 0 :(得分:1)

看起来你有两个重复的方法,唯一的区别是对象的特定操作(在这种情况下,在Campaigns上调用返回DataTable的方法)。您正在尝试(我认为)将此重构为一个方法,其中一个操作被抽象化。这是lambda表达式的完美工作。

public static DataTable GetCampaignInSomeWay(Func<Campaigns, DataTable>  CampaingsDelegate) 
{
   DataTable dtCampaigns = new DataTable();

   Campaigns Campaigns = new Campaigns();
   dtCampaigns = CampaingsDelegate(Campaigns);

   return dtCampaigns;
}

然后这样称呼它:

GetCampaignInSomeWay(C => C.Select(someCampaignId));

GetCampaignInSomeWay(C => C.SelectStatus(0));

Action和Func代表系列对于这样的事情非常有用。以下是一些文档。请注意,Action和Func都有多个泛型重载

http://msdn.microsoft.com/en-us/library/bb549151.aspx

http://msdn.microsoft.com/en-us/library/018hxwa8.aspx

答案 1 :(得分:1)

我不是DataTable的忠实粉丝,但我不会说将一个方法传递给另一个方法是新手编程。相反,它有助于代码遵循Single Responsibility Principle。请采取以下措施:

List<Campaigns> list = GetCampaignsList(GetNewCampaigns());

此处非常清楚这些方法的用途:GetNewCampaigns获取新广告系列,GetCampaignsList获取DataTable并将内容作为列表返回。每种方法都有一个明确的责任。如果你将代表传递给GetCampaignsList,它会突然做两件事;调用delgate获取结果,并将结果的格式转换为列表。

我会在你的设计中提出一些改变:

  • Campaigns类型的名称更改为Campaign,因为我认为每个实例代表一个广告系列。
  • 更改GetCampaignsList的返回类型,而是返回IEnumerable<Campaign>,并可能将方法名称更改为GetCampaigns