在尝试执行转换之前确定转换是否有效

时间:2011-08-25 14:31:37

标签: vb.net type-conversion

我有以下子程序:

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是否会成功吗?从而避免这种异常 - 如逻辑流?

3 个答案:

答案 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