Ho molti metodi che richiedono un po 'di registrazione con lo stesso modello. Alcuni metodi devono restituire un valore, altri no. Ho creato un metodo con parametro Action per evitare copypasting di tutta la logica. Ecco come si presenta:Combinazione di azione e Func in un parametro
private void Execute(Action action)
{
Logger.Start();
try
{
action();
}
catch(Exception exception)
{
Logger.WriteException();
throw;
}
finally
{
Logger.Finish();
}
}
ora ho alcune chiamate che in quel modo
public void DoSomething(string parameter)
{
Execute(() => GetProvider(parameter).DoSomething());
}
ma ho bisogno di qualche funzione che restituiscono valori. Quali sono i modi migliori per farlo? Ho trovato due ora:
1) Creare una copia del metodo Execute con Funz
private T Execute<T>(Func<T> action)
{
Logger.Start();
try
{
return action();
}
catch(Exception exception)
{
Logger.WriteException();
throw;
}
finally
{
Logger.Finish();
}
}
questo metodo funziona, ma ha incollare qualche copia pure.
2) ingannare i parametri in essere un'azione:
public Result DoSomething(string parameter)
{
Result result = null;
Execute(() => result = GetProvider(parameter).DoSomething());
return result;
}
Questo non richiede copia incolla, ma non sembra così bello.
C'è un modo per unire Action e Func in qualche modo per evitare uno di questi metodi o potrebbe esserci un altro modo per ottenere lo stesso risultato?
Io uso il secondo dei tuoi approcci. Non sono riuscito a trovare un buon modo per farlo in un altro modo, quindi sarei interessato a vedere qualsiasi risposta alla tua domanda! –
Sembra essere correlato: http://stackoverflow.com/q/4279210/55209 –
considera l'utilizzo degli aspetti http://stackoverflow.com/questions/1416880/aspect-oriented-programming-in-c-sharp – Lanorkin