在派生的C#类中隐藏VB类中的方法

时间:2011-04-20 16:08:13

标签: c# .net vb.net method-hiding

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

(VB类)

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

(C#class)

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

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

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

3 个答案:

答案 0 :(得分:1)

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

你应该(几乎)从不使用'new'来重新声明方法或属性。如果某些代码假设它是基类,即使你传递了派生类,也会调用基本方法。

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

Early and late binding

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

“你在哪里调用BaseImageChanged尝试使用反射”

答案 1 :(得分:0)

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

答案 2 :(得分:0)

看起来这里发生的是

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

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