c#泛型委托与out参数 - 定义和调用

Nat*_*han 5 c# delegates out-parameters

我正在重构一个现有的DAL,它有一个用户调用的外观和一个内部类,它根据ADO.Net提供程序进行实际工作,例如SqlProvider,我正在努力确保代码干,我'通过使用Func完成了所以我可以这样做:

return RunCommand(c => c.ExecuteNonQuery(commandText, parameters));
Run Code Online (Sandbox Code Playgroud)

RunCommand方法如下所示:

    private T RunCommand<T>(Func<Commands, T> toRun)
    {
        return toRun(CreateCommand());
    }
Run Code Online (Sandbox Code Playgroud)

CreateCommand()方法只是构建要使用的命令对象,这允许我有一个方法来处理所有只返回预期类型的​​调用,例如DataSet,DataReader等

我遇到的问题是,在立面上的几个调用提供了一个out参数,我知道应该可以删除重复的代码,如果我可以使用委托,但经过大量的谷歌搜索和实验我没有设法弄清楚如何.代码是:

 Commands commands = CreateCommand();
 return commands.ExecuteNonQuery(out cmd, commandText, parameters);
Run Code Online (Sandbox Code Playgroud)

我真正想做的是能够打电话:

return RunCommand(c => c.ExecuteNonQuery(out cmd, commandText, parameters));
Run Code Online (Sandbox Code Playgroud)

我已经看到了这个现有问题,但对于我的生活,我无法弄清楚如何将其变成我需要的东西.

这个代表似乎是我需要的,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);
    }
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我,因为这让我疯了一个星期!

Jon*_*eet 11

您的代理人有三个参数而不是两个.假设你想要它镜像Func,而不是:

private delegate V TestOutParameter<T, U, V>(T a, out U b, V c);
Run Code Online (Sandbox Code Playgroud)

你应该有:

private delegate V TestOutParameter<T, U, V>(T a, out U b);
Run Code Online (Sandbox Code Playgroud)

我个人建议你将它重命名为:

private delegate TResult FuncOut<T1, T2, TResult>(T1 arg1, out T2 arg2)
Run Code Online (Sandbox Code Playgroud)

  • @Nathan:你的lambda表达式只有一个参数而不是两个.它需要像`(命令c,out DbCommand cmd)=> c.ExecuteNonQuery(out cmd,commandText,parameters))`.遗憾的是,当您的委托具有ref/out参数时,您无法在lambda表达式中使用类型推断. (2认同)