Могут ли делегаты C # работать таким образом? - PullRequest
0 голосов
/ 02 февраля 2011

Я пытаюсь использовать делегатов, чтобы сократить мой код в этом проекте.У меня есть 4 DropDownLists на моей странице asp.net.В моем файле codebehind я связываю их с различными вызовами бизнес-объектов с данными.Прямо сейчас у меня есть следующий код:

DeptList.DataSource = bl.getAcademicDepts();
DeptList.DataBind();
TermList.DataSource = bl.getTerms();
TermList.DataBind();
InstructorList.DataSource = bl.getInstructors();
InstructorList.DataBind();
EEList.DataSource = bl.getEE();
EEList.DataBind();

Это кажется действительно повторяющимся, поэтому я решил сделать функцию как ярлык

private void SourceAndBind(DropDownList d, <business layer method call>)
{
    d.DataSource = <businesslayer method call>();
    d.DataBind();
}

Тогда мой первый блок кода просто становится

SourceAndBind(DeptList, bl.getAcademicDepts());
SourceAndBind(TermList, bl.getTerms());
SourceAndBind(InstructorList, bl.getInstructors());
SourceAndBind(EEList, bl.getEE());

Однако я не знаю, что поставить для второго параметра.Каждый из вызовов бизнес-уровня не принимает параметров, но каждый из них возвращает объекты разных типов.Я пытался использовать делегаты, но я не мог понять, как их создать без определенного типа возвращаемого значения или без параметров.Можно ли добиться того, что я хочу с C #?Я знаю, что это работает в Python, откуда я и пришел.

Ответы [ 3 ]

4 голосов
/ 02 февраля 2011

Вам не нужны делегаты для этого. Просто объявите второй параметр как object.

// Takes drop down list and data to assign to 'data source'
private void SourceAndBind(DropDownList d, object data) {
    d.DataSource = data;
    d.DataBind();
}

// Call methods from bussiness layer and bind results
SourceAndBind(DeptList, bl.getAcademicDepts());
SourceAndBind(TermList, bl.getTerms());
SourceAndBind(InstructorList, bl.getInstructors());
SourceAndBind(EEList, bl.getEE()); 

Вы также можете использовать делегатов. Однако, поскольку вы вызываете метод только один раз, вы можете вызвать метод бизнес-уровня, чтобы получить данные, а затем передать результат в SourceAndBind. (Делегаты могут быть полезны, например, если вы хотите выбрать один из нескольких способов загрузки данных или если вы хотите отложить загрузку до более позднего момента).

3 голосов
/ 02 февраля 2011

Ну, Func<object> было бы очень общим способом сделать это.Это «функция без параметров, которая возвращает объект».Любая функция без параметров, возвращающая ссылочный тип, должна быть преобразована в этот тип делегата.Тем не менее, ваш код "использования" был бы не совсем верным.Это будет:

SourceAndBind(DeptList, bl.getAcademicDepts);
SourceAndBind(TermList, bl.getTerms);
SourceAndBind(InstructorList, bl.getInstructors);
SourceAndBind(EEList, bl.getEE);

Обратите внимание на отсутствие скобок, что означает, что это метод групп , а не метод , вызывающий .(Чтобы следовать соглашениям именования .NET, я бы предложил переименовать ваши методы, чтобы начать с заглавных букв, кстати.)

Это подходит, если вы хотите вызвать метод условно.Однако, как говорит Томас, вам не нужно использовать делегатов здесь.Если вы рады, что SourceAndBind будет вызван только после того, как вы вызвали метод, вы можете просто выполнить вызов метода в аргументе и передать результат как object.

0 голосов
/ 02 февраля 2011
private void SourceAndBind(DropDownList d, Func<IEnumerable<object>> businessLayerMethod)
{
    d.DataSource = businessLayerMethod();
    d.DataBind();
}

IEnumerable<object> где объект - это ваш тип данных.

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