嘿所有, 我是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;代表但无法提出解决方案。
答案 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都有多个泛型重载
答案 1 :(得分:1)
我不是DataTable
的忠实粉丝,但我不会说将一个方法传递给另一个方法是新手编程。相反,它有助于代码遵循Single Responsibility Principle。请采取以下措施:
List<Campaigns> list = GetCampaignsList(GetNewCampaigns());
此处非常清楚这些方法的用途:GetNewCampaigns
获取新广告系列,GetCampaignsList
获取DataTable
并将内容作为列表返回。每种方法都有一个明确的责任。如果你将代表传递给GetCampaignsList
,它会突然做两件事;调用delgate获取结果,并将结果的格式转换为列表。
我会在你的设计中提出一些改变:
Campaigns
类型的名称更改为Campaign
,因为我认为每个实例代表一个广告系列。GetCampaignsList
的返回类型,而是返回IEnumerable<Campaign>
,并可能将方法名称更改为GetCampaigns
。