Ответ 1
Вы имеете в виду это?:
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);
Это устраняет некоторые сценарии и функциональные возможности, которые должен обрабатывать метод. Путем сокращения возможных параметров, которые должна обрабатывать подпись метода, проблема становится более простой и управляемой.