Сохранение функции для запуска позже - PullRequest
4 голосов
/ 13 июля 2010

У меня есть цикл, который должен будет пометить функции для запуска позже, после завершения цикла. Это возможно сделать?

Спасибо, Тайлер

Ответы [ 4 ]

10 голосов
/ 13 июля 2010

Вы можете сохранить функцию в делегате :

private void Test(object bar)
{
    // Using lambda expression that captures parameters
    Action forLater = () => foo(bar);
    // Using method group directly
    Action<object> forLaterToo = foo;
    // later
    forLater();
    forLaterToo(bar);
}

private void foo(object bar)
{
    //...
}
4 голосов
/ 13 июля 2010
 Dictionary<Action, bool> functionsToRun = new Dictionary<Action, bool>();

 functionsToRun.Add(() => { Console.WriteLine("This will not run"); }, false);
 functionsToRun.Add(() => { Console.WriteLine("Run forest run!!!!!!"); }, true);

 foreach (KeyValuePair<Action, bool> function in functionsToRun)
 {
     if (function.Value)
         function.Key.Invoke();
 }

Надеюсь, это то, что вы ищете!

2 голосов
/ 13 июля 2010

Посмотрите на реализацию событий.Это именно то, для чего они.

// define a delegate signature for your functions to implement:
public delegate void PostProcessingHandler(object sender, object anythingElse /*, etc.*/);

public class YourClass {

  // define an event that will fire all attached functions:
  public event PostProcessingHandler PostProcess;

  public void YourMethod() {

    while(someConditionIsTrue) {

      // do whatever you need, figure out which function to mark:
      switch(someValue) {
        case "abc": PostProcess += new PostProcessingHandler(HandlerForABC); break;
        case "xyz": PostProcess += new PostProcessingHandler(HandlerForXYZ); break;
        case "123": PostProcess += new PostProcessingHandler(HandlerFor123); break;
        default: break;
      } 
    }

    // invoke the event:
    if(PostProcess != null) { PostProcess(); }
  }

  public void HandlerForABC(object sender, object anythingElse) {  /*...*/  }

  public void HandlerForXYZ(object sender, object anythingElse) {  /*...*/  } 

  public void HandlerFor123(object sender, object anythingElse) {  /*...*/  }
}
2 голосов
/ 13 июля 2010

Конечно, я недавно написал программу для своей работы, которая делает это и даже больше.Реализуйте шаблон команды . Концептуально это похоже на программируемый пульт дистанционного управления.Он также учитывает транзакции и другие полезные мелочи.

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