6

我目前正在重构一个现有的 DAL,它有一个用户调用的外观和一个内部类,它依赖于 ADO.Net 提供程序来执行实际工作以使用例如 SqlProvider,并且我正在尝试确保代码是 DRY,我已经使用 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));

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

这个委托似乎是我需要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);
    }

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

4

1 回答 1

12

您的委托有三个参数,而不是两个。假设您希望它镜像 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)
于 2011-07-25T09:40:31.650 回答