Есть ли в C# способ сохранить вызов функции для последующего вызова? Например, я хочу иметь возможность сказать:
public class MyFunctionCaller
{
public static void SaveFunctionCallForLater(/* Some parameters*/)
{
// Save the Function Call in a variable or a list to be invoked after a set amount of time
}
}
public class MyProgram
{
public static void Main()
{
// Save a call to 'SpecialFunction' along with its parameters,
// and maybe the object that's calling it (not applicable in
// this example context, but important to my question)
MyFunctionCaller.SaveFunctionCallForLater(/* Stuff */);
}
public void SpecialFunction(/* Stuff */)
{
// Does some cool stuff
}
}
Позвольте мне дать вам некоторый контекст : я создаю игру в XNA и хочу создать класс DelayedFunctionCaller, на который может ссылаться любой объект для передачи полных вызовов функций, а также время ожидания перед вызовом функции. -ожидание и запуск самого себя, так что это не то место, где я потерялся, я просто не уверен, как или правильно упаковать функцию, которая будет передана в DelayedFunctionCaller.
Вот кикер: DelayedFunctionCaller должен иметь возможность для запуска любой функции, независимо от того, какой объект посылает ей функцию, что функция возвращает или какие параметры она принимает **.У меня уже есть более 100 классов в моей игре, и цель состоит в том, чтобы создать объект, который может сохранить любой вызов функции из любого из них для последующего вызова.
Итак, в результате моего собственного исследования я нашелType
classи знаю, что могу сохранить тип вызываемого объекта, имя функции в виде строки (которая является приемлемая жертва), затем используйтеGetMethod()
для сохранения метода в MemberInfo
, затем используйтеMemberInfo
's Invoke()
для вызвать функцию даже для сохраненного объекта и с параметрами (в виде массива Objects
).
Но все это кажется очень... халтурным. Однажды я попытался посмотреть это и подумал, что общие делегаты— это то, чем я хотел заниматься, но я так запутался в этом, что сдался. Я на правильном пути? Это единственный способ сделать это? Как насчет универсальных делегатов, или я просто сошел с ума, когда думал, что это решит мою проблему?
Любая помощь приветствуется. Спасибо!