Exécuter la méthode avant et après le blocage de code

Comment pourrais-je mettre du code entre parenthèses pour faire ce qui suit?

MyCustomStatement(args){ // code goes here } 

Pour qu’avant l’exécution du code entre crochets, il appellera une méthode et, une fois que le code entre crochets aura été exécuté, il en appellera une autre. Une telle chose existe t elle? Je sais que cela semble superflu de le faire lorsque je peux simplement appeler les méthodes avant et après le code, etc., mais j’étais simplement curieux. Je ne sais pas comment le dire exactement parce que je suis novice en programmation.

Merci!

Vous pouvez le faire en stockant le code dans une classe abstraite qui exécute les codes “avant” et “après” lorsque vous appelez 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 } } 

Et dans le code d’appel:

 new CustomJob().Run(); 

Bien entendu, pour chaque élément de code personnalisé, vous devrez créer une nouvelle classe, ce qui peut être moins que souhaitable.

Un moyen plus simple serait d’utiliser une 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() } } 

Que vous pouvez appeler comme ceci:

 public void OneOfYourMethods() { // your code } public void RunYourMethod() { new BeforeAndAfterRunner().Run(OneOfYourMethods); } 

Pour réaliser littéralement ce que vous voulez, vous pouvez utiliser un délégué:

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

Cela nécessite d’append une “syntaxe étrange” à vos blocs et de comprendre le fonctionnement des delegates et des fonctions anonymes en C #. Plus généralement, si vous faites cela au sein d’une classe, utilisez la technique présentée dans la réponse de @ CodeCaster.