我有以下子程序:
Private Sub MySub(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ControlEventArgs) Handles Me.ControlAdded
Try
AddHandler CType(e.Control, MyDerivedControlType).selectionChanged, AddressOf MyEventHander
Catch ' This just protects against other types of control being added to the group box
End Try
End Sub
目的是为添加到表单的任何控件设置事件处理程序,但前提是它是某种控件 - 由其最大派生类型决定。
暂时搁置总体设计问题,尽管此子例程正常运行,但在运行调试器时,常量异常会将消息保留在“立即窗口”中。这很烦人,并且可能只是为了立即重新捕获它们而抛出异常是浪费。
在尝试之前,我可以确定CType
是否会成功吗?从而避免这种异常 - 如逻辑流?
答案 0 :(得分:4)
您可以使用TryCast。
Private Sub MySub(ByVal sender As Object, ByVal e As ControlEventArgs) Handles Me.ControlAdded
Dim ctl = TryCast(e.Control, MyDerivedControlType)
If (ctl IsNot Nothing) Then
AddHandler ctl.selectionChanged, AddressOf MyEventHander
End If
End Sub
如果转换不成功, TryCast
将返回Nothing
,否则它将返回转换为指定类型的对象。我相信C#这个“try cast”看起来像var ctl = e.Control as MyDerivedControlType;
。
答案 1 :(得分:1)
在当前行之前,您可以使用TryCast而不是CType。如果结果不是任何内容,则在添加事件时使用结果。
答案 2 :(得分:1)
我不知道VB的等价物是什么,但在C#中你可以这样做:
if (e.Control is MyDerivedControl)
{
MyDerivedControl ctrl = (MyDerivedControl)e.Control;
}
编辑:这是VB.NET中的代码
If TypeOf ctrl Is MyDerivedControl Then
Dim derivedCtrl As MyDerivedControl = DirectCast(ctrl, MyDerivedControl)
End If