2014-10-21 3 views
4

Как я могу скопировать некоторый код в скобки, чтобы сделать следующее?Выполнить метод до и после кода кода

MyCustomStatement(args){ 
// code goes here 
} 

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

Спасибо!

+0

Я понятия не имею, о чем вы спрашиваете. Что вы подразумеваете под словом «wrap some code in brackets»? – James

+0

Вы хотите создать мероприятие? см. [События (C#)] (http://msdn.microsoft.com/en-us/library/awbftdfh.aspx) – SmartDev

+0

Применить [шаблон метода шаблона] (http://en.wikipedia.org/wiki/Template_method_pattern) –

ответ

5

Вы можете сделать это путем сохранения кода в абстрактном классе, который выполняет «до» и «после» коды для вас, когда вы звоните Run():

public abstract class Job 
{ 
    protected virtual void Before() 
    { 
     // Executed before Run() 
    } 

    // Implement to execute code 
    protected abstract void OnRun(); 

    public void Run() 
    { 
     Before(); 
     OnRun(); 
     After(); 
    } 

    protected virtual void After() 
    { 
     // Executed after Run() 
    } 
} 

public class CustomJob : Job 
{ 
    protected override void OnRun() 
    { 
     // Your code 
    } 
} 

И в вызывающем коде:

new CustomJob().Run(); 

Конечно, для каждого фрагмента пользовательского кода вам необходимо создать новый класс, который может быть менее желательным.

Легче всего было бы использовать Action:

public class BeforeAndAfterRunner 
{ 
    protected virtual void Before() 
    { 
     // Executed before Run() 
    } 

    public void Run(Action actionToRun) 
    { 
     Before(); 
     actionToRun(); 
     After(); 
    } 

    protected virtual void After() 
    { 
     // Executed after Run() 
    } 
} 

Что вы можете назвать так:

public void OneOfYourMethods() 
{ 
    // your code 
} 

public void RunYourMethod() 
{ 
    new BeforeAndAfterRunner().Run(OneOfYourMethods); 
} 
+0

Хороший ответ. Как я могу вызвать метод OneOfYourMethods с параметрами и как получить возвращаемое значение метода. – suphero

+0

@suphero см. Http://stackoverflow.com/questions/14738533/dispatch-invoke-new-action-with-a-parameter, http://stackoverflow.com/questions/4965508/how-can-i-pass- а-параметр в действии – CodeCaster

3

буквально добиться того, что вы хотите, вы можете использовать делегат:

Action<Action> callWithWrap = f => { 
    Console.WriteLine("Before stuff"); 
    f(); 
    Console.WriteLine("After stuff"); 
}; 

callWithWrap(() => { 
    Console.WriteLine("This is stuff"); 
}); 

Для этого требуется добавление ng «странный синтаксис» для ваших блоков и понимание того, как работают делегаты и анонимные функции на C#. Чаще всего, если вы делаете это в классе, используйте технику, продемонстрированную в ответе @ CodeCaster.

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