Определите, является ли преобразование действительным, прежде чем пытаться его выполнить - PullRequest
2 голосов
/ 25 августа 2011

У меня есть следующая подпрограмма:

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 ]

4 голосов
/ 25 августа 2011

Вы можете использовать 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 голос
/ 25 августа 2011

Я не знаю, что такое VB-эквивалент, но в C # вы можете сделать это:

if (e.Control is MyDerivedControl)
{
    MyDerivedControl ctrl = (MyDerivedControl)e.Control;
}

EDIT : вот код в VB.NET

If TypeOf ctrl Is MyDerivedControl Then
    Dim derivedCtrl As MyDerivedControl = DirectCast(ctrl, MyDerivedControl)
End If
1 голос
/ 25 августа 2011

Перед вашей текущей строкой вы можете использовать TryCast вместо CType. Используйте результат при добавлении события, если результат не является ничем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...