2016-08-06 2 views
0

Я знаю, что в javascript я могу передать имя функции и массив варов, а затем выполнить эту функцию с этими варами в произвольный момент позже ,Есть ли способ сохранить и затем выполнить произвольный вызов функции

Это облегчает то, что все в основном одно и то же. В C# существует также var, но похоже, что тип определяется в зависимости от того, что вы помещаете в него.

То, что я пытаюсь сделать это, чтобы сказать:

взять функцию и параметры: Foo (bar1, bar2 ... Barn)

и выполнять их в течение 5 секунд.

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

псевдо-код:

class myTimerClass{ 
    functionHandle myFunction; 
    var params; 
    float startTime, delayTime; 
    bool pending = false; 

    public myTimerClass(functionHandle myFunction, var params, float delay){ 
    this.myFunction = myFunction; 
    this.params = params; 
    this.delay = delay; 
    this.startTime = System.currentTime; 
    pending = true; 
    } 
    public void update(){ 
    if(System.currentTime>=startTime+delay && pending){ 
     pending = false; 
     INVOKE(myFunction,params); 
    } 
    } 

} 
<something calls the update() every frame> 

Я прочитал на действия и FUNC <> и делегатов, но не кажется, что должен быть способ для обработки произвольной функции с произвольным Params.

+0

Возможный дубликат [C# с задержкой вызова функций] (http://stackoverflow.com/ques/545533/c-sharp-delay-function-calls) –

+0

Просто используйте наиболее общий тип функции 'Делегат', а затем его метод' Invoke'. –

+0

Посмотрите на третий ответ, а не на принятый. Вам не нужно 'bar()', вы можете сделать все это в лямбда. IMHO очень похож на JavaScript, где setTimeout() также использует таймер. –

ответ

1

После еще поисков я наконец нашел то, что работает:

http://answers.unity3d.com/answers/932529/view.html

я могу передать буквально любой код, и он будет выполнять в любое время. Отлично!

Теперь у меня есть отдельный класс (только, чтобы держать его в чистом виде), которая имеет следующий блок:

public void doThingAfterTime(System.Action action, float time){ 
    StartCoroutine(CoroutineUtils.DelaySeconds(action,time)); 
} 

Так что я могу сделать что-то вроде

doThingAfterTime (() => doPrint ("s", "d"), 2); 

, который будет работать найти, чтобы назвать это функция, которая для справки:

public void doPrint(string s, string s2){ 
    print (s); 
    print (s2); 
} 
Смежные вопросы