6

私は現在、ユーザーが呼び出すファサードと、使用するADO.Netプロバイダーに依存する実際の作業を行う内部クラス(例:SqlProvider)を持つ既存のDALをリファクタリングしており、コードがDRYであることを確認しようとしています。 Funcを使用して問題なく実行できたので、次のことができます。

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

また、RunCommandメソッドは次のようになります。

    private T RunCommand<T>(Func<Commands, T> toRun)
    {
        return toRun(CreateCommand());
    }

このCreateCommand()メソッドは、使用するコマンドオブジェクトを作成するだけです。これにより、DataSet、DataReaderなどの期待されるタイプを返すすべての呼び出しを処理する単一のメソッドを使用できるようになります。

私が抱えている問題は、ファサードのいくつかの呼び出しがout、デリゲートを使用できる場合に繰り返されるコードを削除できるはずのパラメーターを提供することですが、多くのグーグルと実験の後、私はその方法を理解できませんでした。コードは次のとおりです。

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

私が本当にやりたいことは、次のように呼び出すことができることです。

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

私はこの既存の質問を見てきましたが、私の一生の間、それを必要なものに変える方法を理解することはできません。

このデリゲートは私が必要としているもののように見えますprivate delegate V TestOutParameter<T, U, V>(T a, out U b, V c);が、それを呼び出すために私が持っているコードは正しくありません:

    private V RunCommand<T, U, V>(TestOutParameter<Commands, DbCommand, V> commandToExecute)
    {
        DbCommand cmd;
        return (V)commandToExecute(CreateCommand(), out cmd);
    }

これが一週間私を怒らせているので、誰かが私を助けることができますか?

4

1 に答える 1

12

デリゲートには、2つではなく3つのパラメーターがあります。次の代わりに、Funcをミラーリングする必要があると仮定します。

private delegate V TestOutParameter<T, U, V>(T a, out U b, V c);

あなたが持っている必要があります:

private delegate V TestOutParameter<T, U, V>(T a, out U b);

個人的には、次のような名前に変更することをお勧めします。

private delegate TResult FuncOut<T1, T2, TResult>(T1 arg1, out T2 arg2)
于 2011-07-25T09:40:31.650 に答える