Вы имеете в виду это? :
void DelayedCall<T>(Action<T> functionToCallLater,
float delayInSecs, params T[] values)
{
//here do something like (just as an example)
functionToCallLater(values);
}
У вас есть объект [], как ваши ценности, но я предполагаю, что вы хотите, чтобы определить их тип, а также с использованием общего. Кроме того, поскольку он не выглядит так, как ваш метод, который вы вызываете, не имеет типа возврата, я использовал Action<T>
вместо Func<T>
.
Основываясь на комментарий ниже,
Если вы хотите принимать различные подписи, у вас действительно есть 2 различных вариантов. Первый, как сказал Слакс, - использовать отражение. Это может стать чрезвычайно сложным, поскольку вам нужно будет определить положение и типы параметров в функцииToCallLater и выровнять их с входящими параметрами из родительской функции. Есть много семантики, которые действительно делают это трудным (хотя это возможно) и действительно больше проблем, чем хуже, когда проблема обобщается для обработки большого числа случаев.
Второй и более проверяемый способом обработки этого сценария (хотя и не обязательно меньше работы), является созданием перегрузок для рассматриваемого метода:
void DelayedCall<T>(Func<T> functionToCallLater,
float delayInSecs, params T[] values)
void DelayedCall<T,R>(Func<T,R> functionToCallLater,
float delayInSecs, params T[] values)
void DelayedCall<T>(Func<T,X,R> functionToCallLater,
float delayInSecs, params T[] values)
etc.
В зависимости от того, насколько сложного метода перегрузки является, это может быть немного утомительным почти невозможным, но он будет работать. Реальный вопрос, который вы хотите задать себе в этом сценарии, заключается в следующем: «Это оптимальный способ справиться с этим подходом?» Например, если вы не нуждаетесь в возвращаемом значении в вызывающем методе, зачем вообще его разрешать? Вы всегда можете заставить абонент обернуть функцию в другом методе, который прилипает к подписи методы следующим образом:
void DelayedCall<T>(Action<T> functionToCallLater,
float delayInSecs, params T[] values)
....
DelayledCallAction<int>(
(i) => MyMethodWhichReturnsSomething(i),
floadDelayInSecs, 1,2,3);
Это устраняет некоторые из сценариев и функциональности метод должен обрабатывать. Путем сокращения возможных параметров, которые должна обрабатывать подпись метода, проблема становится более простой и управляемой.
Вместо этого вы должны принять лямбда. – SLaks