我目前正在重构具有用户调用的外观的现有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