Necesito escribir una función de delegado que pueda "ajustar" algo mientras/try/catch code alrededor de una llamada UDP básica para verificar el enlace. Lo hice funcionar para Func para una función que no tiene argumentos, pero no puedo hacer que funcione para Action, que tiene un argumento (pero no retorno). Parece que no puedo pasar la discusión de una manera lógica sin que el compilador se queje.Usando la acción <T> como argumento en C# (imitando un puntero a la función)
¿Estoy hablando de algo así? Soy nuevo en C# y esencialmente estoy tratando de imitar la idea de un puntero a la función. ¿No debería sobrecargar esta función? Sé que no se puede sobrecargar a los delegados (supongo que es por eso que Func y Action existen).
Esto funciona:
protected TResult udpCommand<TResult>(Func<TResult> command)
{
TResult retValue = default(TResult);
while (!linkDownFail)
{
try
{
retValue = command();
break;
}
catch
{
LinkStateCallBack(ip, getLinkStatus());
if (linkDownFail) throw new LinkDownException();
Thread.Sleep(100);
}
}
return retValue;
}
Pero esto no es así:
protected void udpCommand<T>(Action<T> command(T value))
{
while(!linkDownFail)
{
try
{
command(value);
break;
}
catch
{
LinkStateCallBack(ip, getLinkStatus());
if (linkDownFail) throw new LinkDownException();
Thread.Sleep(100);
}
}
return;
}
convención de llamada (por uno que funcione):
udpCommand<uint>(someUdpCommand);
Adicional: en realidad no necesita la T; puedes simplemente tomar 'Action' (no arg), y llamar como: udpCommand (() => SomeMethod (123)); –
¿Esto me permitiría tener un número variable de parámetros de entrada para udpCommand sin sobrecargarlo para, digamos, hasta 4 parámetros? Eso es lo que necesito hacer. ¿Todavía necesitaría un Func y una Acción? – cgyDeveloper