在派生的C#类中对VB类隐藏方法
我正在为一个名为ImageEditor的大型复杂类编写一组单元测试,该类来自一段遗留代码,其中图像处理和GUI功能没有严格划分。类中的一个方法BaseImageChanged似乎完全关注图像的显示方式,应该在单元测试中禁用,以避免不必要的复杂性。测试项目用C#,原始代码用VB编写;我的想法是在C#中为类创建一个Decorator,然后将该方法隐藏在一个不做任何操作的空方法后面。但是,当我尝试运行单元测试时,VB代码一直引用旧的BaseMageChanged方法,就好像替换方法不存在一样。以下是我正在做的: (VB类) (C级) 有没有一种方法可以实现这种互操作性,或者我必须找到另一种方法在派生的C#类中对VB类隐藏方法,c#,.net,vb.net,method-hiding,C#,.net,Vb.net,Method Hiding,我正在为一个名为ImageEditor的大型复杂类编写一组单元测试,该类来自一段遗留代码,其中图像处理和GUI功能没有严格划分。类中的一个方法BaseImageChanged似乎完全关注图像的显示方式,应该在单元测试中禁用,以避免不必要的复杂性。测试项目用C#,原始代码用VB编写;我的想法是在C#中为类创建一个Decorator,然后将该方法隐藏在一个不做任何操作的空方法后面。但是,当我尝试运行单元测试时,VB代码一直引用旧的BaseMageChanged方法,就好像替换方法不存在一样。以下是我
编辑:编译器错误原来是反射问题。另外,只要基类是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() {}
}