Как создать список методов, затем выполнить их?
Я пытаюсь создать список, содержащий методы, и после того, как я добавлю некоторые методы, которые я хочу выполнить, возможно ли это?
Я пробовал что-то вроде этого:
List<object> methods = new List<object>();
Тогда:
methods.Add(Move());
Но когда я добавлю, программа вызовет методы, например, в этом случае она вызвала Move();
Ответы
Ответ 1
Это большой вариант использования для Action
общего делегата.
List<Action> functions = new List<Action>();
functions.Add(Move);
foreach (Action func in functions)
func();
Если вам нужны параметры, я бы использовал lambdas, чтобы отвлечь их:
List<Action> functions = new List<Action>();
functions.Add(Move);
functions.Add(() => MoveTo(1, 5));
foreach (Action func in functions)
func();
Делегат сродни указателям на функции из С++, он содержит функцию "is" (а не возвращаемое значение, как в вашем примере), поэтому вы можете называть ее точно так же, как регулярную функцию. Общий делегат Action не принимает никаких параметров и ничего не возвращает, поэтому он идеален для общего "вызова этих функций".
MSDN для действий: Делегат действий
Ответ 2
Вы можете использовать делегаты. Создайте список делегатов. Затем для каждого метода, который вы хотите добавить в список, создайте делегат и добавьте его в список.
List<Delegate> methods = new List<Delegate>();
// creates an Action delegate implicitly
methods.Add((Action)Move);
Ответ 3
Я не уверен, что это выходит за рамки исходного вопроса (или поможет кому-либо еще), но я продолжал возвращаться на эту страницу в своем собственном поиске того, как создать список функций возвращаемого типа для итерации и выполнения. Я закончил использование List<Func<T>>
для создания списка типов methods-
bool RTrue()
{
Console.WriteLine("RETURNS TRUE");
return true;
}
bool RFalse()
{
Console.WriteLine("RETURNS FALSE");
return false;
}
List<Func<Boolean>> functions = new List<Func<Boolean>>();
functions.Add(RTrue);
functions.Add(RFalse);
foreach (Func<Boolean> func in functions)
{
if (func() == true)
{
Console.WriteLine("IT WORKS");
}
}
Дополнительная информация о Func usage- Что такое Func, как и когда он используется