我目前正在重构一个现有的DAL,它有一个用户调用的外观和一个内部类,它根据ADO.Net提供程序进行实际工作,例如使用它。 SqlProvider,我正在尝试确保代码是干的,我已经通过使用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));
我已经看到了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);
}
任何人都可以帮助我,因为这让我疯了一个星期!
答案 0 :(得分: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)