Общий делегат C # с параметром out - определение и вызов

В настоящее время я занимаюсь рефакторингом существующего DAL, у которого есть фасад, который вызывает пользователь, и внутренний класс, который выполняет фактическую работу в зависимости от поставщику ADO.Net для использования, например, SqlProvider, и я пытаюсь убедиться, что код является СУХИМ, у меня все в порядке, используя Func, поэтому я могу сделать:

return RunCommand(c => c.ExecuteNonQuery(commandText, parameters));

А метод RunCommand выглядит так:

    private T RunCommand(Func toRun)
    {
        return toRun(CreateCommand());
    }

CreateCommand () просто создает объект команды для использования, это затем позволяет мне иметь единственный метод, который обрабатывает все вызовы, которые просто возвращают ожидаемый тип, например DataSet, DataReader и т. Д.

У меня проблема в том, что несколько вызовов фасада предоставляют параметр out , который, как я знаю, должен иметь возможность удалить повторяющийся код, если я могу использовать делегат, но после большого количества поисков в Google и экспериментируя, я так и не понял, как это сделать. Код такой:

 Commands commands = CreateCommand();
 return commands.ExecuteNonQuery(out cmd, commandText, parameters);

Я бы действительно хотел позвонить:

return RunCommand(c => c.ExecuteNonQuery(out cmd, commandText, parameters));

Я видел этот существующий вопрос, но, хоть убей, я не могу понять, как повернуть это в то, что мне нужно.

Этот делегат может показаться мне тем, что мне нужно частный делегат V TestOutParameter (T a, out U b, V c); но код У меня есть за то, что это неправильно:

    private V RunCommand(TestOutParameter commandToExecute)
    {
        DbCommand cmd;
        return (V)commandToExecute(CreateCommand(), out cmd);
    }

Кто-нибудь может мне помочь, так как это сводит меня с ума уже неделю!

5
задан Community 23 May 2017 в 11:45
поделиться