次の抽象クラスから継承するいくつかのユーザーコントロールがあります。
Public MustInherit Class CustomVRAUserControl
Inherits System.Web.UI.UserControl
Public MustOverride Sub ClearErrors()
Public MustOverride Sub UpdateLabels()
Public MustOverride Function Validate() As Boolean
Public MustOverride Sub UpdateSession()
End Class
ユーザーコントロールを使用するウィザードがあります。特定の条件に対して、いくつかの動的な作業の削除手順があります。ウィザードのサンプルは次のとおりです。
<asp:Wizard ID="VRAWizard" runat="server"......>
<WizardSteps>
<asp:WizardStep ID="wizResidentialAddress" runat="server"
Title="RESIDENTIAL ADDRESS" StepType="Step">
<uc2:ResidentialAddress ID="uctlResidentialAddress" runat="server" />
</asp:WizardStep>
<asp:WizardStep ID="wizMailingAddress" runat="server"
Title="MAILING ADDRESS" StepType="Step">
<uc3:MailingAddress ID="uctlMailingAddress" runat="server" />
</asp:WizardStep>
</WizardSteps>
</asp:Wizard>
ウィザードクラスの背後にあるコードでは、NextButtonのクリックにいくつかの作業があります。
Protected Sub VRAWizard_NextButtonClick(sender As Object, e As System.Web.UI.WebControls.WizardNavigationEventArgs) Handles VRAWizard.NextButtonClick
If VRAWizard.ActiveStep.ID = "wizResidentialAddress" Then
uctlResidentialAddress.ClearErrors()
If Not (uctlResidentialAddress.validate) Then
uctlResidentialAddress.UpdateLabels()
e.Cancel = True
Else
uctlResidentialAddress.UpdateSession()
End If
End If
If VRAWizard.ActiveStep.ID = "wizMailingAddress" Then
uctlMailingAddress.ClearErrors()
If Not (uctlMailingAddress.validate) Then
uctlMailingAddress.updateLabels()
e.Cancel = True
Else
uctlMailingAddress.UpdateSession()
End If
End If
明らかに、それはかなり繰り返しです。
…のようなことをしたいのですが。
CType(VRAWizard.ActiveStep.Controls.Item(0), CustomVRAUserControl).ClearErrors()
If Not (CType(VRAWizard.ActiveStep.Controls.Item(0), CustomVRAUserControl).Validate()) Then
CType(VRAWizard.ActiveStep.Controls.Item(0), CustomVRAUserControl).UpdateLabels()
e.Cancel = True
Else
CType(VRAWizard.ActiveStep.Controls.Item(0), CustomVRAUserControl).UpdateSession()
End If
ただし、もちろん、コンパイラーはキャストを作成できないため、これを行うとランタイムエラーが発生します。
何か案は?