С# Любая функция как параметр

Можно ли создать метод, который принимает ЛЮБОЙ метод (независимо от его параметров) в качестве параметра? Метод также имеет параметр 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);
}