2015-04-10 5 views
0

Я знаю, что этот вопрос задавался много раз во многих формах, но теперь я хочу прояснить некоторые вещи.Отправить метод как параметр другому методу (уточнение)

2 метода: метод по умолчанию и дополнительный метод. Сначала мы выполняем метод по умолчанию с базовыми операциями. Затем, если дополнительный метод был передан методу по умолчанию в качестве параметра, выполните его также.

???void Default_Method(???Additional_Method) 
{ 
    //default logic 
    //after default logic, call additional method if its name was specified 
    ??? - how to call the specified additional method 
} 

???void Additional_Method() 
{ 
    //additional logic 
} 

... 

А теперь самое интересное место

protected void Page_Load(object sender, EventArgs e) 
{ 
    Default_Method(???Additionl_Method???) //here I need to pass Additional_Method as a parameter 
} 

ВОПРОС:

Как объявить методы правильно. Я отметил места для уточнения с помощью ??? знак.

А как сделать дополнительный метод необязательным параметром метода по умолчанию? Достаточно ли пропускать Null, когда он не нужен?

ПРИЧИНА ЭТОГО ВОПРОС

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

ответ

2
void Default_Method(Action additionalMethod = null) 
{ 
    //default logic   
    //after default logic, call additional method if its name was specified 

    //This if is needed to avoid NullReferenceException 
    if (additionalMethod != null) 
     additionalMethod(); 
} 

void Additional_Method() 
{ 
    //additional logic 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    Default_Method(Additional_Method); 
    //OR 
    Default_Method(); 
    //OR 
    Default_Method(null); 
    //OR 
    Default_Method(() => { /*Do something*/}); 
} 

В этом примере я предположил, что оба метода определяются в том же классе, как Page_Load.

+0

Хорошо, у меня есть идея. На самом деле я сам разработал решение именно сейчас, оно зависело от специфики проекта и было решено немного по-другому, но ваш ответ выглядит хорошо, в отношении моего первоначального вопроса. Есть еще несколько вопросов о передаче методов в качестве параметров, и я попрошу их позже в других потоках. Благодарю. – SWA

1

ИМХО лучше использовать Action:

void Additional_Method() 
    { 

    } 

    void Default_Method(Action a) 
    { 
     a.Invoke(); 
    } 

в главном использовании кода

Default_Method(Additional_Method); 
+0

Спасибо, это тоже хороший ответ. – SWA

Смежные вопросы