Создание общего метода, который принимает менеджер и функцию
public T Do<T, TManager>(TManager manager, Func<TManager, T> something)
{
try
{
if (manager != null) return something(manager);
LoggingHandler.LogWarning(LogTitle, $"manager ({this}) is null.");
}
catch (MyException exp)
{
ExceptionHandler.HandleRecoverableException(exp, LogTitle,
$"query on manager ({this}) failed.");
}
var msg = $"failed to query using manager ({this})!";
LoggingHandler.LogCritical(LogTitle, msg);
throw new MyException(msg);
}
public void DoAll<T>(Func<X, T> somethingX, Func<Y, T> somethingY)
{
Do(CoreInfrastructure.GetManager(Prefix, Config.Param1, Config.Param2), somethingX);
Do(CoreInfrastructure.GetManager(Prefix, Config.Param3), somethingY);
}
Как упомянул Damien_The_Unbeliever, если источником создания менеджера может быть MyException
, вы можете добавить Func<TManager>
вместо менеджера TManager:
public T Do<T, TManager>(Func<TManager> managerCreate, Func<TManager, T> something)
{
try
{
TManager manager = managerCreate();
if (manager != null) return something(manager);
LoggingHandler.LogWarning(LogTitle, $"manager ({this}) is null.");
}
catch (MyException exp)
{
ExceptionHandler.HandleRecoverableException(exp, LogTitle,
$"query on manager ({this}) failed.");
}
var msg = $"failed to query using manager ({this})!";
LoggingHandler.LogCritical(LogTitle, msg);
throw new MyException(msg);
}
public void DoAll<T>(Func<X, T> somethingX, Func<Y, T> somethingY)
{
Do(() => CoreInfrastructure.GetManager(Prefix, Config.Param1, Config.Param2), somethingX);
Do(() => CoreInfrastructure.GetManager(Prefix, Config.Param3), somethingY);
}
Вы можете пойти дальше и заменить Func<TManager>
параметризованной функцией, где вы передаете Prefix
и Config