Преобразование кода обработки событий из C# в VB.NET

Я пытаюсь преобразовать этот код, написанный на С#, в VB:

// Initialize the Message Broker Events
(Application.Current as App).MessageBroker.MessageReceived += new MessageReceivedEventHandler(MessageBroker_MessageReceived);
(Application.Current as App).MessageBroker.MessageReceived += new MessageReceivedEventHandler(MessageBroker_SpecialMessageReceived);

Это то, что у меня сейчас есть, но при запуске всегда выдает ошибку:

' Initialize the Message Broker Events
AddHandler TryCast(Application.Current, App).MessageBroker.MessageReceived, AddressOf MessageBroker_MessageReceived
AddHandler TryCast(Application.Current, App).MessageBroker.MessageReceived, AddressOf MessageBroker_SpecialMessageReceived

Есть ли что-то, что я делаю неправильно?

Вот остальная часть моего кода:

Partial Public Class MainWindow
Inherits Window

Public Sub New()
    InitializeComponent()

    ' Initialize the Message Broker Events
    'AddHandler TryCast(Application.Current, App).MessageBroker.MessageReceived, AddressOf MessageBroker_MessageReceived
    'AddHandler TryCast(Application.Current, App).MessageBroker.MessageReceived, AddressOf MessageBroker_SpecialMessageReceived

    TryCast(Application.Current, App).MessageBroker.MessageReceived += New MessageReceivedEventHandler(MessageBroker_MessageReceived)
    TryCast(Application.Current, App).MessageBroker.MessageReceived += New MessageReceivedEventHandler(MessageBroker_SpecialMessageReceived)

End Sub

Private Sub MessageBroker_MessageReceived(ByVal sender As Object, ByVal e As MessageBrokerEventArgs)
    ' Use this event to receive all messages
    Select Case e.MessageName.ToLower()
        Case "message1"
            ' Do something with this message
            Exit Select
        Case "message2"
            ' Do something with this message
            Exit Select
        Case "etc."
            ' Do something with this message
            Exit Select
        Case Else

            If Not String.IsNullOrEmpty(e.MessageObject.MessageBody) Then
                MessageBox.Show(e.MessageObject.MessageBody)
            End If
            Exit Select
    End Select
End Sub

Private Sub MessageBroker_SpecialMessageReceived(ByVal sender As Object, ByVal e As MessageBrokerEventArgs)
    ' Use this event to receive any special message objects
    If TypeOf e.MessageObject Is MySpecialMessage Then
        MessageBox.Show(DirectCast(e.MessageObject, MySpecialMessage).SpecialMessage)
    End If
End Sub

person adam bond    schedule 15.12.2011    source источник
comment
Этот сайт является хорошим инструментом для преобразования языков .net.   -  person Jim    schedule 16.12.2011


Ответы (3)


Попробуй это:

TryCast(Application.Current, App).MessageBroker.MessageReceived += New MessageReceivedEventHandler(MessageBroker_MessageReceived)
 TryCast(Application.Current, App).MessageBroker.MessageReceived += New  MessageReceivedEventHandler(MessageBroker_SpecialMessageReceived)

Я использовал http://converter.telerik.com/, который обычно мне подходит.

person Leopold Stotch    schedule 15.12.2011
comment
то же самое здесь .. вот как я быстро получил ответ .. LOL - person MethodMan; 16.12.2011
comment
Нет, это не сработало. Я тоже пользуюсь этим сайтом, и он довольно хорош, согласен. Но что я получаю с вашим кодом, так это то, что я не могу вызвать событие напрямую. Вот почему я попытался вместо этого добавить обработчик. - person adam bond; 16.12.2011
comment
можете ли вы опубликовать точный код, который вы используете.. возможно, мы не видим некоторые инкапсулированные свойства или уровни доступа к классам - person MethodMan; 16.12.2011

попробуйте это и посмотрите, будет ли это работать

TryCast(Application.Current, App).MessageBroker.MessageReceived += New MessageReceivedEventHandler(MessageBroker_MessageReceived)
TryCast(Application.Current, App).MessageBroker.MessageReceived += New MessageReceivedEventHandler(MessageBroker_SpecialMessageReceived)
person MethodMan    schedule 15.12.2011

Во-первых, код C# неверен.

// Initialize the Message Broker Events
(Application.Current as App).MessageBroker.MessageReceived +=
    new MessageReceivedEventHandler(MessageBroker_MessageReceived);

(Application.Current as App).MessageBroker.MessageReceived +=
    new MessageReceivedEventHandler(MessageBroker_SpecialMessageReceived);

так должно быть,

// Initialize the Message Broker Events
((App)Application.Current).MessageBroker.MessageReceived +=
    new MessageReceivedEventHandler(MessageBroker_MessageReceived);

((App)Application.Current).MessageBroker.MessageReceived +=
    new MessageReceivedEventHandler(MessageBroker_SpecialMessageReceived);

и ВБ будет,

CType(Application.Current, App).MessageBroker.MessageReceived +=
    New MessageReceivedEventHandler(MessageBroker_MessageReceived)

CType(Application.Current, App).MessageBroker.MessageReceived +=
    New MessageReceivedEventHandler(MessageBroker_SpecialMessageReceived)

as и TryCast сначала проверяют тип экземпляра, чтобы убедиться, что он соответствует типу приведения. Если нет, он вернет null, и вы получите исключение NullReferenceException. Вместо этого вы должны приводить тип напрямую, используя либо (Type)instance, либо CType(instance, Type). Логично, что это не будет иметь значения, но вы все равно должны понимать разницу. :)

person cwharris    schedule 16.12.2011