带有 out 参数的 c# 泛型委托(delegate) - 定义和调用

标签 c# delegates out-parameters

我目前正在重构一个现有的 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()方法简单地构建要使用的命令对象,然后这允许我有一个单一的方法来处理所有只返回预期类型的​​调用,例如数据集、数据读取器等

我遇到的问题是外观上的几个调用提供了一个 out如果我可以使用委托(delegate),我知道参数应该能够删除重复的代码,但是经过大量谷歌搜索和试验后,我还没有弄清楚如何做。代码是:

 Commands commands = CreateCommand();
 return commands.ExecuteNonQuery(out cmd, commandText, parameters);

我真正想做的是能够调用:

return RunCommand(c => c.ExecuteNonQuery(out cmd, commandText, parameters));

我看过 this存在的问题,但对于我的生活,我无法弄清楚如何将其变成我需要的东西。

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

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

最佳答案

您的委托(delegate)有三个参数,而不是两个。假设您希望它镜像 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)

关于带有 out 参数的 c# 泛型委托(delegate) - 定义和调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6814159/

相关文章:

iphone - 跳过带有委托(delegate)的 View Controller

python - 有没有办法通过C++中的OUT参数接收Python中的返回值?

c# - 属性类不调用构造函数

c# - 这个 C# 语法的 VB 等价物是什么,处理委托(delegate)?

c# - 如何使委托(delegate)线程成为STA

c# - C# 'out'参数有用的真实示例?

c# - 如何重写具有 out 参数的虚拟方法?

c# - 使用 Visual Studio 2008 错误创建输出文件夹

c# - .NET 中是否有 SortedList<T> 类?

c# - 滞后循环以解决由于噪声引起的 "flickering"值