使用Object参数的方法不会接受除Object之外的任何内容

时间:2009-10-06 16:10:04

标签: c# unit-testing rhino-mocks parameters

我们有一个VB.net函数,在InitializerFactory类中有以下签名:

Public Shared Function Create(ByRef ui As Object) As IModeInitializer

我试图通过传递ui的模拟来测试这个函数(使用Rhino Mocks):

MainForm ui = mocks.StrictMock<MainForm>();
IModeInitializer item = InitializerFactory.Create(ref ui);

尝试将ui作为参数传递时,出现以下错误:

  • 最佳重载方法匹配 'InitializerFactory.Create(ref object)'有一些无效的参数
  • 参数'1':无法从'ref MainForm'转换为'ref object'

理想情况下,解决方案是在UI(或其类,MainForm)上提取接口,但这无论如何都不可行 - 这是一个非常臃肿的类。

我也不能将ui声明为Object,否则我无法模仿其中的方法,因为这些方法不属于Object类型。

我的问题是 - 我做错了什么?

1 个答案:

答案 0 :(得分:3)

这只是因为ref参数语法。问题是该函数必须能够设置任何类型的对象,因为它是一个by参数。你不能只是传递一个对MainForm的引用,这就是你正在尝试的。

不幸的是,这是一个非常难以使用的API。

您可以通过首先将实例分配给对象来处理此问题:

MainForm ui = mocks.StrictMock<MainForm>();
object uiObj = ui;
IModeInitializer item = InitializerFactory.Create(ref uiObj);
if (uiObj != ui) { 
    // Handle the case where the reference changed!
    ui = uiObj as MainForm; // May be null, if it's no longer a "MainForm"
}

如果您想完全理解这一点,可以阅读Covariance and Contravariance