2011-07-25 10 views
5

私は現在、ユーザーが呼び出すファサードを持つ既存のDALと、ADO.Netプロバイダに依存する実際の作業を行う内部クラスをリファクタリングしています。 SqlProvider、と私はそのコードを確保しようとしているDRYですが、私はそう私にできるのFuncを使用して[OK]をやった:outパラメータを使用した汎用代理人 - 定義および呼び出し

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)); 

私はthis既存の質問を見てきましたが、私の人生のために、私はどのようにうまくできませんそれを私が必要とするものに変える。

このデリゲートは、私が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); 
    } 

誰も私を助けることができます週間!

答えて

11

代理人には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) 
+0

センス、それは素晴らしいです。しかし、私はまだそれを呼び出す方法について私の頭を傷つけています。 T1は実際のメソッドを呼び出すために必要なクラスであり、その上にoutパラメータがあります。 TBH私はそれをどのように呼び出すかについて迷っています。 – Nathan

+0

@Nathan: 'CreateCommand'メソッドが' Commands'を返す限り、デリゲート型を変更すると 'RunCommand'コードは問題なくコンパイルできます。 –

+0

これは私が失敗し続けるところを参照してください:) 'RunCommand'コードはうれしいですが、' return RunCommand(c => c.ExecuteNonQuery(out cmd、commandText、parameters));)を使用しようとすると ' VSは "refまたはoutパラメータを使用できません"。 私はメソッドを呼び出すための正しい構文を使用していないと思いますか? – Nathan

関連する問題