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

在派生的C#类中对VB类隐藏方法,c#,.net,vb.net,method-hiding,C#,.net,Vb.net,Method Hiding,我正在为一个名为ImageEditor的大型复杂类编写一组单元测试,该类来自一段遗留代码,其中图像处理和GUI功能没有严格划分。类中的一个方法BaseImageChanged似乎完全关注图像的显示方式,应该在单元测试中禁用,以避免不必要的复杂性。测试项目用C#,原始代码用VB编写;我的想法是在C#中为类创建一个Decorator,然后将该方法隐藏在一个不做任何操作的空方法后面。但是,当我尝试运行单元测试时,VB代码一直引用旧的BaseMageChanged方法,就好像替换方法不存在一样。以下是我

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

(VB类)

(C级)

有没有一种方法可以实现这种互操作性,或者我必须找到另一种方法


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

我根本不懂VB,但这听起来更像是一个带有
覆盖
虚拟
方法,而不是一个隐藏方法。VB代码可能正在某处调用“this.BaseImageChanged()”,而这不会调用您的新方法。。。对吗?

我一点也不懂VB,但这听起来更像是一个带有
覆盖的
虚拟
方法,而不是一个隐藏的方法。VB代码可能正在某处调用“this.BaseImageChanged()”,而这不会调用您的新方法。。。对吗?

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

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

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

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


“调用BaseImageChanged的地方请尝试使用反射”

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

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

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

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


“在您调用BaseMageChanged的地方,请尝试使用反射”

看起来这里发生的事情是这样的

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

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

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

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

    没有“this.BaseImageChanged”形式的调用,只有“BaseImageChanged”。在任何情况下,如果我试图覆盖,我最终会遇到几乎相同的问题;将VB方法声明更改为“Overridable Sub BaseImageChanged()”,将C#方法更改为“public override void BaseImageChanged(){}”,会出现一个编译器错误,该错误表示“没有合适的方法进行重写”。@estanford:一些愚蠢的问题,C#类是否派生自VB类?如果调用
    ((BaseClass))也会发生同样的情况子类)。BaseImagechanged
    ,如果您使用
    foreach(列表中的BaseClass c)
    列表
    进行重新搜索,则会发生这种情况。测试调用是什么样子的?@Pete:test从未显式调用BaseMageChanged,但是BaseMageChanged被另一个方法调用,FlipLR是我感兴趣的测试方法。没有“this.BaseMageChanged”形式的调用,只有“BaseMageChanged”。在任何情况下,如果我试图覆盖,我最终会遇到几乎相同的问题;将VB方法声明更改为“Overridable Sub BaseImageChanged()”,将C#方法更改为“public override void BaseImageChanged(){}”,会出现一个编译器错误,该错误表示“没有合适的方法进行重写”。@estanford:一些愚蠢的问题,C#类是否派生自VB类?如果调用
    ((BaseClass))也会发生同样的情况子类)。BaseImagechanged
    ,如果您使用
    foreach(列表中的BaseClass c)
    列表
    进行重新搜索,则会发生这种情况。测试调用是什么样子的?@Pete:测试从未显式调用BaseMageChanged,但BaseMageChanged被另一个方法调用,FlipLR是我感兴趣的测试方法。我确实可以访问VB代码,但将该方法标记为可重写(相当于虚拟)当我试图在C#代码中重写它时,给我一个编译器错误。我不知道为什么这个C#/VB对你来说失败了;我从来没有试过;调用BaseImageChanged try using时,您确实可以访问VB代码,但将该方法标记为可重写(相当于virtual)会在尝试重写I时出现编译器错误
    Public Class ImageEditor
      ...
      Public Sub BaseImageChanged()
      ...
      End Sub
      ...
    End Class
    
    class ImageEditorTestingClass : ImageEditor_Accessor
    {
       public new void BaseImageChanged() {}
    }