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

本文关键字:定义 调用 泛型 out 参数 带有 | 更新日期: 2023-09-27 18:03:29

我目前正在重构一个现有的DAL,它有一个用户调用的外观和一个依赖于ADO完成实际工作的内部类。Net提供程序使用例如SqlProvider,我试图确保代码是DRY,我已经通过使用一个函数做得很好,所以我可以做:

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

和RunCommand方法看起来像:

    private T RunCommand<T>(Func<Commands, T> toRun)
    {
        return toRun(CreateCommand());
    }

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

我遇到的问题是,在facade上的几个调用提供了一个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);
    }
有谁能帮帮我吗?这件事已经让我发疯一个星期了!

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

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