2011-02-02 5 views
0

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

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#? Я знаю, что работает на питоне, откуда я родом.

ответ

4

Для этого вам не нужны делегаты. Просто объявите второй параметр как 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()); 

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

+0

Это, безусловно, то, что я ищу! –

3

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

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

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

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

+0

ok Я не поставил скобки буквально. Я просто привык использовать их, когда делаю код-заполнитель. –

+0

Наилучшее перегруженное соответствие метода для 'CourseFinder2.CF1.SourceAndBind (System.Web.UI.WebControls.DropDownList, System.Func )' имеет некоторые недопустимые аргументы. –

+0

моя подпись метода теперь 'private void SourceAndBind (DropDownList d, Func method)' и выше ошибка - это то, что я получаю ?? –

0
private void SourceAndBind(DropDownList d, Func<IEnumerable<object>> businessLayerMethod) 
{ 
    d.DataSource = businessLayerMethod(); 
    d.DataBind(); 
} 

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

+0

Это не сработает для меня, потому что не все мои методы возвращают IEnumerable. Некоторые из них являются списками, а некоторые - строками. –