我目前正在重構具有用戶調用的外觀的現有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);
}
任何人可以幫助我,這已經把我逼瘋了周!
該委託熟能生巧感覺,這是偉大的。然而,我仍在摸索着如何去調用它。 T1是我需要調用實際方法的類,它具有out參數。 TBH我失去了如何稱呼它。 – Nathan
@Nathan:只要'CreateCommand'方法返回一個'Commands',委託類型的改變就可以讓你的'RunCommand'代碼編譯時沒有問題。 –
看到這裏我一直在失敗:)'RunCommand'代碼很高興,但是當我嘗試使用'return RunCommand(c => c.ExecuteNonQuery(out cmd,commandText,parameters));'我被告知VS「不能使用ref或out參數」。 我想我沒有使用正確的語法來調用該方法? – Nathan