Рассмотрение
Насколько я знаю, невозможно вызвать метод, не зная его сигнатуры.
И в C # это не похоже на Javascript или Python илиНапример, в Ruby сигнатура является статической, окончательно определенной после компиляции, поэтому неизменной.
Даже используя отражение объекта в качестве параметра, у вас будет та же проблема, что и для управления параметрами этого неизвестного метода, имеющего неизвестные параметры неизвестногоtypes.
C # - это язык со строгим типом, скомпилированный язык, даже с использованием динамики.
C # Обобщения не означают, наоборот, неизвестные типы и сигнатуры, и онине шаблоны C ++, даже если это предки.
Использование params
для параметров
https://docs.microsoft.com/dotnet/csharp/language-reference/keywords/params
public delegate void ParameterizedActionWithParams(params object[] parameters);
public void MyAction(ParameterizedActionWithParams action, params object[] parameters)
{
if ( action != null )
action(parameters);
else
ManageArgumentNullException();
}
Использование спискаобъектов
public delegate void ParameterizedActionWithList(List<object> parameters);
public void MyAction(ParameterizedActionWithList action, List<object> parameters)
{
if ( action != null )
action(parameters);
else
ManageArgumentNullException();
}
Ограничения
Вы не можете иметь строго типизированные аргументы.
И если вам нужны функции, то естьпроблема, если возвращаемый параметр можетварьируются, и вы можете сделать только:
public delegate object ParameterizedFuncWithParams(params object[] parameters);
public delegate object ParameterizedFuncWithList(List<object> parameters);
Поэтому вам нужно создать следующие варианты:
public object MyFunc(ParameterizedFuncWithParams func, params object[] parameters)
{
if ( func != null )
return func(parameters);
else
ManageArgumentNullException();
}
public object MyFunc(ParameterizedFuncWithList func, List<object> parameters)
{
if ( func != null )
return func(parameters);
else
ManageArgumentNullException();
}