2011-07-25 114 views
5

我目前正在重構具有用戶調用的外觀的現有DAL,以及實際工作依賴於ADO.Net提供程序來使用的內部類。 sqlProvider的,我試圖以確保代碼是乾的,我已經做了好利用函數求,所以我可以做的:c#具有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

您的代表有三個參數而不是兩個。假設你想讓它反映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