C# 与代表一起寻找更好的解决方案

C# 与代表一起寻找更好的解决方案,c#,delegates,C#,Delegates,大家好, 我是C语言的新手,对我的案例的更好的解决方案很好奇 我有一个方法,它将DataTable作为参数,创建一个包含MyClass变量的列表并返回它 public static List<Campaigns> GetCampaignsList(DataTable DataTable) { List<Campaigns> ListCampaigns = new List<Campaigns>(); foreach (

大家好, 我是C语言的新手,对我的案例的更好的解决方案很好奇

我有一个方法,它将DataTable作为参数,创建一个包含MyClass变量的列表并返回它

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;
    }
但问题是,这个getNewCampages方法不接受参数,但其他方法可以接受参数。例如,当我尝试选择带有活动ID的活动时,我必须将活动ID作为参数发送。所有这些数据库方法都将返回类型作为DataTable,但参数的数量不同

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

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

        return dtCampaigns;
    }
最后,我想将一个委托作为参数传递给我的第一个GetCampaignList方法,该参数将决定调用哪个数据库方法。我不想将DataTable作为参数传递,因为它是新手编程

你能帮我了解更多的高级功能吗。
我搜索了它,找到了Func delegate,但没有找到解决方案。

看起来您有两个重复的方法,唯一的区别是对对象的特定操作,在本例中是对返回数据表的活动的方法调用。我想你是想把它重构成一个方法,抽象出一个操作。对于lambda表达式来说,这是一个完美的工作

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

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

   return dtCampaigns;
}

动作族和Func委托对于类似的事情非常有用。这是一些文件。请注意,Action和Func都有多个泛型重载

我不是DataTable的忠实粉丝,但我不会说将一种方法传递到另一种方法是新手编程。相反,它有助于代码遵循规则。采取以下行动:

List<Campaigns> list = GetCampaignsList(GetNewCampaigns());
这里很清楚这些方法的作用:GetNewCampaigns获取新的活动,GetCampaignsList获取一个数据表,并将内容作为列表返回。每种方法都有一个明确的责任。如果您将一个委托传递给GetCampaignsList,它会突然做两件事;调用delgate以获取结果,并将结果的格式转换为列表

不过,我建议在您的设计中进行一些更改:

将类型Campaigns的名称更改为Campaign,因为我认为每个实例代表一个单独的Campaign。 更改GetCampaignsList的返回类型,改为返回IEnumerable,并可能将方法名称改为GetCampaigns。
我不知道代表是否是你真正想要的。代理不会减少或组织静态函数的数量。我想我真的很想用泛型。如果您使用该代码从数据行创建一个新的活动,并将其放入显式运算符重载中以将数据行转换为活动,那么您将创建一个外观非常干净的公共静态列表GetObjListthis DataTable DataTable如果您在活动上为Select和其他项放置一个接口,则可以执行一个干净的公共静态列表IList GetDetails比较,其中T:i选择有助于改进我的代码。我会尽力去做你的建议。非常感谢弗雷德里克的回答和鼓励,我会做你的每一个建议。非常感谢亚当,我很好奇其他可以看到不同方面的方法。
GetCampaignInSomeWay(C => C.Select(someCampaignId));
GetCampaignInSomeWay(C => C.SelectStatus(0));
List<Campaigns> list = GetCampaignsList(GetNewCampaigns());