2011-07-25 83 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