В примере кода есть несколько вещей, которые мне не нравятся.Но, чтобы явно ответить на ваш вопрос об удалении дублирования, извлеките общий код из метода, который принимает делегат.
private TReturn RestoreConnectionAndExecute<T>(SqlCommand command, Func<SqlCommand, TReturn> execute)
{
int retryCount = 0;
while (retryCount++ < MaxRetryCount)
{
try
{
if (command.Connection.State == ConnectionState.Close)
command.Connection.Open();
return execute(command);
}
catch(Exception e)
{
...
}
}
public SqlDataReader RestoreConnectionAndExecuteReader(SqlCommand command)
{
return this.RestoreConnectionAndExecute(command, c => c.ExecuteReader());
}
public void RestoreConnectionAndExecuteNonQuery(SqlCommand command)
{
// Ignore return
this.RestoreConnectionAndExecute(command, c => c.ExecuteNonQuery());
}
Однако вам действительно следует переосмыслить несколько вещей.Включая:
- Перехват определенных исключений
- Использование Exception.Number или ErrorCode вместо сообщения (которое изменится в локализованных версиях и, возможно, в обновленных версиях FX)
- Использование операторов для IDisposable ресурсов
- Создание определенных исключений