Potrzebuję napisać funkcję delegata, która może "owinąć" niektóre podczas/spróbować/złapać kod wokół podstawowego połączenia UDP, aby zweryfikować link. Udało mi się pracować dla Func dla funkcji, która nie ma argumentów, ale nie mogę sprawić, żeby działała na działanie, która ma argument (ale nie ma powrotu). Nie wydaje mi się, aby przekazać argument w logiczny sposób bez narzekania kompilatora.Używanie akcji jako argument w języku C# (naśladowanie wskaźnika funkcji)
Czy to wszystko źle? Jestem nowy w C# i zasadniczo próbuję naśladować ideę wskaźnika funkcji. Czy nie powinienem przeciążać tej funkcji? Wiem, że nie można przeciążać delegatów (zakładam, że dlatego Func i Action istnieją).
to działa:
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;
}
Ale tego nie robi:
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;
}
Wywołanie konwencji (na taki, który działa):
udpCommand<uint>(someUdpCommand);
Dodatek - w rzeczywistości nie potrzebujesz T; możesz po prostu wziąć "Akcja" (brak argumentu) i wywołać jako: udpCommand (() => SomeMethod (123)); –
Czy pozwoliłoby to mieć zmienną liczbę parametrów wejściowych do udpCommand bez przeciążania go, powiedzmy, do 4 parametrów? Właśnie to muszę zrobić. Czy nadal potrzebuję jednego Func i jednej akcji? – cgyDeveloper