С# Любая функция как параметр
Можно ли создать метод, который принимает ЛЮБОЙ метод (независимо от его параметров) в качестве параметра? Метод также имеет параметр params
, который затем принимает все параметры для параметра-метода.
Итак, в основном я хочу что-то вроде этого:
public void CallTheMethod(Action<int> theMethod, params object[] parameters)
Но тогда для любого метода, а не только для методов, которые принимают int.
Возможно ли подобное?
Спасибо
Ответы
Ответ 1
Да, с делегатом:
public object CallTheMethod(Delegate theMethod, params object[] parameters)
{
return theMethod.DynamicInvoke(parameters);
}
Но см. комментарий Марка Гравелла по вашему вопросу:)
Ну, вы могли бы передать неспецифический Delegate
, но DynamicInvoke
sloooooowwwwww (условно говоря)
Ответ 2
Возможно, но не то, что должно быть сделано.
Это то, что я сделал бы:
public void CallTheMethod(Action toCall)
Вы можете пойти "да". В основном, это позволяет пользователю сделать это:
CallTheMethod(() => SomeOtherMethod(with, some, other, parameters));
Однако, если вы хотите, чтобы он возвращал тип, он включает в себя generics:
public void CallTheMethod<T>(Func<T> theMethod)
Вы можете установить общие ограничения для этого типа, делать с ним все, что хотите, и т.д.
Ответ 3
Да. Вы можете использовать DynamicInvoke для вызова методов:
Action<int> method1 = i => { };
Func<bool, string> method2 = b => "Hello";
int arg1 = 3;
bool arg2 = true;
//return type is void, so result = null;
object result = method1.DynamicInvoke(arg1);
//result now becomes "Hello";
result = method2.DynamicInvoke(arg2);
Метод для этого:
object InvokeMyMethod(Delegate method, params object[] args)
{
return method.DynamicInvoke(args);
}