Asp.net 在VB.NET中,如何重写函数并从祖辈超类调用同名函数?

Asp.net 在VB.NET中,如何重写函数并从祖辈超类调用同名函数?,asp.net,vb.net,inheritance,overriding,Asp.net,Vb.net,Inheritance,Overriding,我正在尝试继承ASP.NET RegularExpressionValidator并向其添加一些功能。我继承了控件并添加了自定义属性。但是,我也希望客户端功能调用不同的JavaScript函数 为了做到这一点,我需要抑制AddAttributesToRender方法中发生的事情,因为函数名在那里是硬编码的。以下是RegularExpressionValidator中AddAttributesToRender函数的Reflector中出现的内容: Protected Overrides Sub A

我正在尝试继承ASP.NET RegularExpressionValidator并向其添加一些功能。我继承了控件并添加了自定义属性。但是,我也希望客户端功能调用不同的JavaScript函数

为了做到这一点,我需要抑制AddAttributesToRender方法中发生的事情,因为函数名在那里是硬编码的。以下是RegularExpressionValidator中AddAttributesToRender函数的Reflector中出现的内容:

Protected Overrides Sub AddAttributesToRender(ByVal writer As HtmlTextWriter)
    MyBase.AddAttributesToRender(writer)
    If MyBase.RenderUplevel Then
        Dim clientID As String = Me.ClientID
        Dim writer2 As HtmlTextWriter = IIf(MyBase.EnableLegacyRendering, writer, Nothing)
        MyBase.AddExpandoAttribute(writer2, clientID, "evaluationfunction", "RegularExpressionValidatorEvaluateIsValid", False)
        If (Me.ValidationExpression.Length > 0) Then
            MyBase.AddExpandoAttribute(writer2, clientID, "validationexpression", Me.ValidationExpression)
        End If
    End If
End Sub
好的,乍一看解决方案似乎很简单:将所有功能复制并粘贴到我的新类中,然后更改函数名。但是,请注意,第一行还调用了超类中的AddAttributesToRender方法。这将是我的自定义类的祖父母超类。以下是层次结构:

BaseValidator>RegularExpressionValidator>MyCustomRegularExpressionValidator

我想知道的是…是否有一种方法可以执行类似于
MyBase.MyBase.AddAttributesToRender(writer)
的操作,这样我就可以跳过对立即超类的AddAttributesToRender调用,而调用BaseValidator中的调用?我尝试了这种语法,并将MyBase转换为类型BaseValidator,但两者都不起作用

或者是从每个基类中获取代码并将其放入我的自定义基类中的唯一解决方案?请注意,BaseValidator将调用传递给其父级,以此类推,再传递3个级别

当我唯一的任务是从直接超类中取消一行并在自定义类中替换它时,似乎有很多事情要做。这是一行:

MyBase.AddExpandoAttribute(writer2, clientID, "evaluationfunction", "RegularExpressionValidatorEvaluateIsValid", False)

注意:我试图在父类之前添加expando属性,以查看代码是否会检查其存在并跳过它,但这只会导致异常。

我将使用StackTrace在父类中查看方法是否由祖父母调用(通过MyBase。[]),如果是这样,则将调用路由到子类(使用另一个MyBase。[]调用。

我不确定您的意思。与使用堆栈跟踪相比,反射器是确定是否正在调用祖父母的更好方法,我已经确认了。是的,我的意思是按如下方式使用堆栈跟踪:使用System.Diagnostics;//get call stack trace StackTrace=new StackTrace();//如果(stackTrace.GetFrame(1.GetMethod().name)==[任何内容],则获取调用方法名称在仔细检查RegularExpressionValidator之后,我意识到类中只有2个方法和1个属性。因为我将对这两个方法进行更改,所以复制整个控件并直接从BaseValidator继承可能会更容易。唯一的障碍是所有的stri存在于.NET资源中的ngs。无论如何,这不是第一次出现这样的情况。当您只想更改基类中的代码,然后级联调用基类的超类时,应该怎么做?