Parámetro de acción con posibles múltiples argumentos
Tengo una función WaitAndRun
. Quiero que este método sea muy genérico.
public static IEnumerator WaitAndRun<T>(float time, Action<T> action, object arg)
{
yield return new WaitForSeconds(time);
action((T)arg);
}
Funciona perfectamente con el siguiente ejemplo:
void an_action(int x)
{
Debug.Log(x);
}
//...
WaitAndRun<int>(1, an_action, 2);
El problema es que quiero usar la misma definición cuando necesito múltiples argumentos también. ¿Cómo puedo hacer que esta función admita llamar tanto con un solo argumento como con múltiples argumentos al mismo tiempo? Por ejemplo:
void another_action(int x, int y);
Si uso object[] args
en lugar de object arg
, no estoy seguro de cómo modificar el resto de la función.
Edit: cambie “func” por “action”
davy.ai
Para hacer que la función
WaitAndRun
admita la llamada de argumentos individuales y múltiples al mismo tiempo, podemos modificar la función para que acepte unparams object[] args
en lugar de un soloobject arg
. Luego necesitaremos modificar la parte restante para pasar correctamente los argumentos al delegadoaction
.Aquí está la función modificada:
Explicación:
params
al parámetroargs
, lo que nos permite pasar cualquier cantidad de argumentos.Primero comprobamos si no hay argumentos o solo hay un argumento, en cuyo caso simplemente llamamos al delegado
action
con el valor predeterminado o el único argumento.Si hay varios argumentos, utilizamos Reflexión para crear un nuevo delegado con la firma correcta (es decir, que coincida con el delegado
action
). Luego invocamos este nuevo delegado con los argumentos.Con estas modificaciones, ahora podemos llamar a la función
WaitAndRun
con cualquier número de argumentos:csharp
WaitAndRun<int>(1, un_action, 2);
WaitAndRun<int>(1, otro_action, 2, 3);
WaitAndRun<string>(1, otro_action, "hola", 5);
WaitAndRun<float>(1, otro_action, 1.2f, 3.4f);