如何使用自定义委托存储带参数的方法?

时间:2015-02-06 14:04:04

标签: c# delegates rhino-mocks stubbing

我正在尝试使用RhinoMock的out方法存根一个具有Do参数的方法,但我不断收到消息无法解析符号outParam 。这是衔接部分:

private static void FakeClientsLoading(MyClass fakeClass, IEnumerable<string> clientsToLoad)
{
    fakeClass.Stub(
        x =>
            x.LoadClientsFromDb(Arg<string>.Is.Anything,
                out Arg<object>.Out(null).Dummy))
        .Do(
            new LoadClientsFromDbAction(
                (someString, out outParam ) =>
                    TestHelper.LoadClients(someString, clientsToLoad)));
 }

这是我的自定义委托声明:

public delegate void LoadClientsFromDbAction(string s, out object outParam);

我想要实现的是在调用LoadClientsFromDb时运行测试助手方法。根据我的理解,outParam应该映射到作为out参数传递给被调用方法的任何内容,但它似乎不会以这种方式工作。

1 个答案:

答案 0 :(得分:1)

似乎我终于找到了问题的答案。事实证明,引用this link中的第26.3.1节:

  

具体而言,委托类型D与匿名方法兼容   或lambda-expression L提供:

     
    

如果L是具有隐式类型参数列表的lambda表达式,则D没有ref或out参数。

  

这意味着您需要一个显式类型化的参数列表,以便创建一个带有out参数的lambda。

但是,这不是全部。退出匿名方法时,仍需要为out参数赋值。

最终和正在运行的代码:

private static void FakeClientsLoading(MyClass fakeClass, IEnumerable<string> clientsToLoad)
{
    fakeClass.Stub(
        x =>
            x.LoadClientsFromDb(Arg<string>.Is.Anything,
                out Arg<object>.Out(null).Dummy))
        .Do(
            new LoadClientsFromDbAction(
                (string someString, out object outParam) =>
                {
                    outParam = null;
                    TestHelper.LoadClients(someString, clientsToLoad);
                }
                ));
}