В поисках лучшего решения с делегатами - PullRequest
1 голос
/ 02 марта 2011

Привет всем, Я новичок в 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;
    }

И один из моих других методов 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;
    }

В конце я хочу передать делегат моему первому методу GetCampaignList в качестве параметра, который определит, какой метод базы данных вызывать. Я не хочу передавать DataTable в качестве параметра, так как это новичок в программировании.

Не могли бы вы помочь мне изучить некоторые дополнительные функции. Я искал его и получил делегат Func <>, но не смог найти решение.

Ответы [ 2 ]

1 голос
/ 02 марта 2011

Я не большой поклонник DataTable как такового, но я бы не сказал, что переход одного метода в другой - это программирование новичка. Напротив, это помогает коду следовать принципу единой ответственности . Возьмите следующее:

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

Здесь очень ясно, что делают методы: GetNewCampaigns получает новые кампании, а GetCampaignsList принимает DataTable и возвращает содержимое в виде списка. Каждый метод имеет одну четкую ответственность. Если вы передадите делегата GetCampaignsList, он вдруг сделает две вещи; вызовите delgate для получения результатов и преобразуйте формат результата в список.

Есть некоторые изменения, которые я бы предложил в вашем дизайне:

  • Измените имена типа Campaigns на Campaign, поскольку я представляю, что каждый экземпляр представляет отдельную кампанию.
  • Измените тип возвращаемого значения GetCampaignsList, вместо этого верните IEnumerable<Campaign> и, вероятно, измените имя метода на GetCampaigns.
1 голос
/ 02 марта 2011

Похоже, у вас есть два дублирующих метода, с той лишь разницей, что конкретная операция над объектом (в данном случае вызов метода в Campaigns, который возвращает DataTable) Вы пытаетесь (я думаю) реорганизовать это в один метод, с одной только абстрагированной операцией. Это идеальная работа для лямбда-выражения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...