1

我正在从一段遗留代码中为一个名为 ImageEditor 的大型复杂类编写一组单元测试,其中图像处理和 GUI 功能没有严格划分。类中的一种方法 BaseImageChanged 似乎完全关注图像的显示方式,应该在我的单元测试中禁用以避免不必要的复杂性。测试项目为C#,原代码为VB;我的想法是为 C# 中的类创建一个装饰器,然后将方法隐藏在一个什么都不做的空方法后面。但是,当我尝试运行单元测试时,VB 代码一直引用旧的 BaseImageChanged 方法,就好像替换不存在一样。这就是我正在做的事情:

(VB类)

Public Class ImageEditor
  ...
  Public Sub BaseImageChanged()
  ...
  End Sub
  ...
End Class

(C#类)

class ImageEditorTestingClass : ImageEditor_Accessor
{
   public new void BaseImageChanged() {}
}

有没有办法实现这种互操作性,还是我必须找到另一种方法?

编辑:编译器错误原来是反射问题。此外,只要基类是 ImageEditor 的访问器而不是原始 ImageEditor 类,覆盖该方法就不起作用。(没有编译器错误,但基方法的行为没有被覆盖。)

4

3 回答 3

1

您可以访问 VB 代码吗?如果是,则将其标记为虚拟(C# 语法);然后在 C# 代码中用空主体覆盖它,这样 id 什么都不做。

您应该(几乎)永远不要使用“新”来重新声明方法或属性。如果某些代码假设它是基类,即使您传递派生类,也会调用基方法。

为了更好地理解,请阅读 .NET 中的后期绑定和早期绑定

早期和晚期绑定

由于我在下面的评论,@estanford 似乎接受了这个答案

“在你调用 BaseImageChanged 的​​地方尝试使用反射”

于 2011-04-20T16:17:55.937 回答
0

我根本不了解 VB,但这听起来更像是一种virtual方法的情况,而override不是方法隐藏。VB 代码可能在某处调用“this.BaseImageChanged()”,这不会调用您的新方法……对吧?

于 2011-04-20T16:12:25.970 回答
0

看起来这里发生的事情是

  1. 你有一个用 VB.Net 编写的库
  2. 您的单元测试是用 C# 编写的,并且正在使用 MSTest
  3. 您正在尝试从生成的访问器而不是原始类派生

在这种情况下,您唯一的选择是使用new. 生成的访问器类不会添加虚拟方法,因此如果您想提供具有相同名称的替代方法new是唯一的方法。

于 2011-04-20T16:40:00.113 回答